Model selection

News Lenta.ru dataset

by Glazunov Artem

Works via Google Colab

Let's connect directories and load useful libs.

In [ ]:
from google.colab import drive
drive.mount('/content/gdrive',force_remount=True)
Go to this URL in a browser: https://accounts.google.com/o/oauth2/auth?client_id=947318989803-6bn6qk8qdgf4n4g3pfee6491hc0brc4i.apps.googleusercontent.com&redirect_uri=urn%3aietf%3awg%3aoauth%3a2.0%3aoob&response_type=code&scope=email%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdocs.test%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdrive%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdrive.photos.readonly%20https%3a%2f%2fwww.googleapis.com%2fauth%2fpeopleapi.readonly

Enter your authorization code:
··········
Mounted at /content/gdrive
In [ ]:
cd /content/gdrive/'My Drive'/Colab_Notebooks/project_intern
/content/gdrive/My Drive/Colab_Notebooks/project_intern
In [ ]:
!pip install pyLDAvis
Collecting pyLDAvis
  Downloading https://files.pythonhosted.org/packages/a5/3a/af82e070a8a96e13217c8f362f9a73e82d61ac8fff3a2561946a97f96266/pyLDAvis-2.1.2.tar.gz (1.6MB)
     |████████████████████████████████| 1.6MB 2.8MB/s 
Requirement already satisfied: wheel>=0.23.0 in /usr/local/lib/python3.6/dist-packages (from pyLDAvis) (0.34.2)
Requirement already satisfied: numpy>=1.9.2 in /usr/local/lib/python3.6/dist-packages (from pyLDAvis) (1.18.5)
Requirement already satisfied: scipy>=0.18.0 in /usr/local/lib/python3.6/dist-packages (from pyLDAvis) (1.4.1)
Requirement already satisfied: pandas>=0.17.0 in /usr/local/lib/python3.6/dist-packages (from pyLDAvis) (1.0.5)
Requirement already satisfied: joblib>=0.8.4 in /usr/local/lib/python3.6/dist-packages (from pyLDAvis) (0.16.0)
Requirement already satisfied: jinja2>=2.7.2 in /usr/local/lib/python3.6/dist-packages (from pyLDAvis) (2.11.2)
Requirement already satisfied: numexpr in /usr/local/lib/python3.6/dist-packages (from pyLDAvis) (2.7.1)
Requirement already satisfied: pytest in /usr/local/lib/python3.6/dist-packages (from pyLDAvis) (3.6.4)
Requirement already satisfied: future in /usr/local/lib/python3.6/dist-packages (from pyLDAvis) (0.16.0)
Collecting funcy
  Downloading https://files.pythonhosted.org/packages/ce/4b/6ffa76544e46614123de31574ad95758c421aae391a1764921b8a81e1eae/funcy-1.14.tar.gz (548kB)
     |████████████████████████████████| 552kB 19.8MB/s 
Requirement already satisfied: pytz>=2017.2 in /usr/local/lib/python3.6/dist-packages (from pandas>=0.17.0->pyLDAvis) (2018.9)
Requirement already satisfied: python-dateutil>=2.6.1 in /usr/local/lib/python3.6/dist-packages (from pandas>=0.17.0->pyLDAvis) (2.8.1)
Requirement already satisfied: MarkupSafe>=0.23 in /usr/local/lib/python3.6/dist-packages (from jinja2>=2.7.2->pyLDAvis) (1.1.1)
Requirement already satisfied: more-itertools>=4.0.0 in /usr/local/lib/python3.6/dist-packages (from pytest->pyLDAvis) (8.4.0)
Requirement already satisfied: six>=1.10.0 in /usr/local/lib/python3.6/dist-packages (from pytest->pyLDAvis) (1.12.0)
Requirement already satisfied: pluggy<0.8,>=0.5 in /usr/local/lib/python3.6/dist-packages (from pytest->pyLDAvis) (0.7.1)
Requirement already satisfied: py>=1.5.0 in /usr/local/lib/python3.6/dist-packages (from pytest->pyLDAvis) (1.9.0)
Requirement already satisfied: atomicwrites>=1.0 in /usr/local/lib/python3.6/dist-packages (from pytest->pyLDAvis) (1.4.0)
Requirement already satisfied: attrs>=17.4.0 in /usr/local/lib/python3.6/dist-packages (from pytest->pyLDAvis) (19.3.0)
Requirement already satisfied: setuptools in /usr/local/lib/python3.6/dist-packages (from pytest->pyLDAvis) (49.1.0)
Building wheels for collected packages: pyLDAvis, funcy
  Building wheel for pyLDAvis (setup.py) ... done
  Created wheel for pyLDAvis: filename=pyLDAvis-2.1.2-py2.py3-none-any.whl size=97711 sha256=9da9b21c7e0716128bdc0b659686ccc96874611a69e3b3c937152b5a65bc13ac
  Stored in directory: /root/.cache/pip/wheels/98/71/24/513a99e58bb6b8465bae4d2d5e9dba8f0bef8179e3051ac414
  Building wheel for funcy (setup.py) ... done
  Created wheel for funcy: filename=funcy-1.14-py2.py3-none-any.whl size=32042 sha256=65e97da628a2a0a77af888af7d1e04b363fb4b08e9128b6822260326b290557b
  Stored in directory: /root/.cache/pip/wheels/20/5a/d8/1d875df03deae6f178dfdf70238cca33f948ef8a6f5209f2eb
Successfully built pyLDAvis funcy
Installing collected packages: funcy, pyLDAvis
Successfully installed funcy-1.14 pyLDAvis-2.1.2
In [ ]:
import os
import numpy as np
import pandas as pd
from pprint import pprint

# Gensim
import gensim
import gensim.corpora as corpora

from gensim.models import CoherenceModel

# Plotting tools
import pyLDAvis
import pyLDAvis.gensim  
import matplotlib.pyplot as plt
%matplotlib inline

# vectorizing and so on
from sklearn.feature_extraction.text import CountVectorizer
import warnings
from tqdm import tqdm_notebook
In [ ]:
PATH_TO_DATA = 'texts_after_preproc'

Loading the preprocessed small data

In [ ]:
data = pd.read_csv(os.path.join(PATH_TO_DATA,'texts_part.csv'),index_col=0)
data
Out[ ]:
texts
464829 крупный сша нефтяной компания сша exxonmobil п...
491243 немецкий нейробиолог обнаруживать первичный ви...
479662 банк москва продавать принадлежать пять процен...
92658 продолжаться сегодня столица катар судебный за...
358436 nasa называть семь плохой семь хороший точка з...
... ...
641460 официальный представитель мид россия мария зах...
635248 заявление вмешательство россия проведение рефе...
786620 оператор связь вымпелком билайн прокомментиров...
325153 представитель овд саяногорск опровергать инфор...
164156 московский милиция задерживать около десять че...

100121 rows × 1 columns

In [ ]:
data_list = data.texts.values.tolist()
data_list[:4]
Out[ ]:
['крупный сша нефтяной компания сша exxonmobil помощь компания катар построить техас терминал сжижение дальнейший экспорт природный газ общий стоимость десять миллиард доллар соответствующий соглашение exxonmobil подписывать qatar petroleum international передавать bloomberg реализация проект сторона образовывать дочерний предприятие golden pass products llc фирма прошлый год получать разрешение экспорт спг страна который сша иметься соглашение свободный торговля прием спг терминал golden pass работать 2010 год планироваться ежегодный объем поставка спг построить терминал составлять 156 миллион тонна проект должный получать окончательный одобрение американский власть апрель сообщаться exxonmobil также собираться построить самый большой мир плавучий завод выпуск спг сотрудничество англоавстралийский горнодобывающий bhp billiton затрата указанный проект оценка эксперт превышать 12 миллиард доллар мощность спгзавод достигать шестисемь миллион тонна год',
 'немецкий нейробиолог обнаруживать первичный визуальный кора мозг способный подобно видеокодек сжимать изображение счет анализ различие поступать картинка исследование опубликовывать журнал cerebral cortex кратко прочитывать сайт рурский университет ученый демонстрировать кошка пара специально обрабатывать фотография изображение дом лес подобный обрабатывать образ стереть деталь определенный направление фоторедактор эффект обычно называться круговой размытие ветер это ученый наблюдать реакция визуальный кора v1 помощь флюоресцентный внутриклеточный белок реагировать концентрация кальций возбуждение отдельный группа нейрон сопровождаться свечение поэтому ученый мочь напрямую наблюдать мозг идти обработка поразному ориентированный деталь изображение оказываться смена поразному обрабатывать изображение частота 33 герц каждый фотография демонстрироваться 30 миллисекунда кора обрабатывать информация частота снижать 10 герц 100 миллисекунда картинка нейрон успевать вычесть изображение кодировать разница ранее нейробиолог полагать сложный обработка изображение мочь проводиться первичный кора v1 осуществляться высокий иерархия зрительный область открытие образ изменять представление ученый область получать вид входить сигнал это следовать отмечать первичный обработка визуальный сигнал проводиться уровень сетчатка сигнал разный колбочка палочка суммироваться нейрон',
 'банк москва продавать принадлежать пять процент акция торговый дом гум это говориться опубликовывать 13 сентябрь материал кредитный учреждение сумма сделка покупатель объявлять информация агентство прайм банк вернуть контроль процент акция гум 30 июль 2013 год сумма сделка продавец также упоминать банк москва получать контроль пятипроцентный пакет акция торговый дом гум 2008 год однако затем потерять контроль процент доля июль кредитный учреждение вновь становиться собственник пять процент акция гум цель дальнейший продажа настоящий время сведение агентство контрольный пакет акция гум принадлежать группа bosco di ciliegi который владеть михаил куснирович семья 2004 год купить 502 процент акция гум тд перекресток сделка оценивать 110120 миллион доллар банк москва являться шестой величина актив финансовый организация россия банк основывать 1995 год февраль 2011 год продавать группа втб выручка гум рсба 2012 год составлять 353 миллиард рубль 143 процент результат 2011 год данные компания магазин красный площадь посещать около 15 миллион человек год',
 'продолжаться сегодня столица катар судебный заседание дело россиянин обвиняемый покушение зелимхан яндарбиев заслушивать показание последний свидетель обвинение сообщать агентство интерфакс ссылка адвокат дмитрий афанасьев который состав рабочий группа оказывать юридический помощь соотечественник ход сегодняшний судебный заседание допрашивать свидетель обвинение работник правоохранительный орган который участвовать следственный действие отмечать адвокат слово образ суд допрашивать 13 свидетель напоминать двое сотрудник российский спецслужба анатолий биляшок василий покшев арестовывать доха ночь 19 февраль вместе задерживать первый секретарь посольство рф катар александр фетисов обладать дипломатический неприкосновенность впоследствии фетисов освобождать 24 марта вернуться родина россия продолжать настаивать невиновность свой гражданин']

Vectorization

In [ ]:
vectorizer = CountVectorizer(ngram_range=(1, 2),min_df=80,max_df =0.2)
matrix = vectorizer.fit_transform(data_list)
In [ ]:
vectorizer.vocabulary_
Out[ ]:
{'крупный': 8515,
 'сша': 18526,
 'нефтяной': 10651,
 'компания': 7828,
 'помощь': 13349,
 'катар': 7533,
 'построить': 13593,
 'техас': 18895,
 'терминал': 18854,
 'дальнейший': 5049,
 'экспорт': 20853,
 'природный': 14341,
 'газ': 4133,
 'общий': 11169,
 'стоимость': 18160,
 'десять': 5373,
 'миллиард': 9406,
 'доллар': 5665,
 'соответствующий': 17563,
 'соглашение': 17349,
 'подписывать': 12935,
 'international': 1346,
 'передавать': 12440,
 'bloomberg': 1196,
 'реализация': 15497,
 'проект': 14555,
 'сторона': 18196,
 'образовывать': 11094,
 'дочерний': 5821,
 'предприятие': 13860,
 'фирма': 20001,
 'прошлый': 14890,
 'разрешение': 15226,
 'иметься': 6951,
 'свободный': 16435,
 'торговля': 18997,
 'прием': 14203,
 'работать': 15059,
 '2010': 548,
 'планироваться': 12656,
 'ежегодный': 5941,
 'объем': 11196,
 'поставка': 13550,
 'составлять': 17613,
 '156': 235,
 'миллион': 9416,
 'тонна': 18982,
 'должный': 5623,
 'окончательный': 11458,
 'одобрение': 11355,
 'американский': 1993,
 'власть': 3242,
 'апрель': 2122,
 'сообщаться': 17528,
 'собираться': 17239,
 'самый': 16287,
 'большой': 2628,
 'мир': 9515,
 'плавучий': 12638,
 'завод': 6159,
 'выпуск': 3979,
 'сотрудничество': 17742,
 'затрата': 6490,
 'указанный': 19435,
 'оценка': 12168,
 'эксперт': 20842,
 'превышать': 13783,
 '12': 104,
 'мощность': 9846,
 'достигать': 5793,
 'нефтяной компания': 10652,
 'компания сша': 7867,
 'природный газ': 14342,
 'общий стоимость': 11178,
 'миллиард доллар': 9409,
 'реализация проект': 15499,
 'дочерний предприятие': 5823,
 'прошлый год': 14892,
 'год получать': 4578,
 'получать разрешение': 13291,
 'страна который': 18242,
 'который сша': 8380,
 'свободный торговля': 16436,
 '2010 год': 549,
 'год планироваться': 4565,
 'объем поставка': 11199,
 'миллион тонна': 9428,
 'должный получать': 5646,
 'американский власть': 2001,
 'апрель сообщаться': 2137,
 'самый большой': 16290,
 'оценка эксперт': 12170,
 '12 миллиард': 114,
 'немецкий': 10494,
 'обнаруживать': 11041,
 'первичный': 12350,
 'визуальный': 3162,
 'кора': 8061,
 'мозг': 9648,
 'способный': 17870,
 'подобно': 12894,
 'изображение': 6892,
 'счет': 18498,
 'анализ': 2038,
 'различие': 15173,
 'поступать': 13597,
 'картинка': 7515,
 'исследование': 7257,
 'опубликовывать': 11619,
 'журнал': 6096,
 'кратко': 8442,
 'прочитывать': 14882,
 'сайт': 16211,
 'университет': 19536,
 'ученый': 19787,
 'демонстрировать': 5296,
 'кошка': 8408,
 'пара': 12257,
 'специально': 17814,
 'обрабатывать': 11084,
 'фотография': 20050,
 'дом': 5707,
 'лес': 8724,
 'подобный': 12895,
 'образ': 11086,
 'стереть': 18139,
 'деталь': 5381,
 'определенный': 11598,
 'направление': 10106,
 'эффект': 21073,
 'обычно': 11234,
 'называться': 10007,
 'ветер': 3052,
 'наблюдать': 9937,
 'реакция': 15495,
 'белок': 2434,
 'реагировать': 15492,
 'концентрация': 8040,
 'возбуждение': 3412,
 'отдельный': 11883,
 'группа': 4971,
 'сопровождаться': 17582,
 'поэтому': 13670,
 'напрямую': 10119,
 'идти': 6769,
 'обработка': 11085,
 'оказываться': 11384,
 'смена': 17143,
 'частота': 20393,
 '33': 881,
 'каждый': 7406,
 'демонстрироваться': 5297,
 '30': 830,
 'информация': 7114,
 'снижать': 17210,
 '10': 20,
 '100': 44,
 'успевать': 19649,
 'разница': 15196,
 'полагать': 13142,
 'сложный': 17094,
 'проводиться': 14478,
 'осуществляться': 11827,
 'высокий': 4027,
 'область': 11009,
 'открытие': 11937,
 'изменять': 6881,
 'представление': 13923,
 'вид': 3129,
 'входить': 3833,
 'сигнал': 16822,
 'следовать': 17009,
 'уровень': 19606,
 'разный': 15201,
 'исследование опубликовывать': 7261,
 'опубликовывать журнал': 11625,
 'это следовать': 21042,
 'следовать отмечать': 17010,
 'банк': 2336,
 'москва': 9705,
 'продавать': 14506,
 'принадлежать': 14281,
 'пять': 15031,
 'процент': 14811,
 'акция': 1915,
 'торговый': 19001,
 'говориться': 4367,
 '13': 139,
 'сентябрь': 16709,
 'материал': 9112,
 'кредитный': 8450,
 'учреждение': 19811,
 'сумма': 18436,
 'сделка': 16601,
 'покупатель': 13134,
 'объявлять': 11206,
 'агентство': 1798,
 'прайм': 13768,
 'вернуть': 2936,
 'контроль': 8019,
 'июль': 7340,
 '2013': 559,
 'продавец': 14510,
 'упоминать': 19559,
 'пакет': 12220,
 '2008': 541,
 'затем': 6483,
 'потерять': 13624,
 'доля': 5704,
 'вновь': 3317,
 'собственник': 17250,
 'цель': 20290,
 'продажа': 14511,
 'настоящий': 10186,
 'сведение': 16396,
 'контрольный': 8022,
 'владеть': 3226,
 'михаил': 9564,
 'семья': 16699,
 '2004': 533,
 'купить': 8587,
 'перекресток': 12481,
 'оценивать': 12163,
 'являться': 21137,
 'шестой': 20701,
 'величина': 2918,
 'актив': 1890,
 'финансовый': 19973,
 'организация': 11664,
 'основывать': 11778,
 '1995': 483,
 'февраль': 19858,
 '2011': 551,
 'втб': 3777,
 'выручка': 4009,
 '2012': 555,
 'рубль': 16077,
 '143': 195,
 'результат': 15594,
 'магазин': 8919,
 'красный': 8433,
 'площадь': 12699,
 'посещать': 13478,
 'около': 11399,
 '15': 202,
 'банк москва': 2339,
 'пять процент': 15039,
 'процент акция': 14812,
 'это говориться': 20965,
 '13 сентябрь': 153,
 'кредитный учреждение': 8454,
 'сумма сделка': 18443,
 'информация агентство': 7115,
 '30 июль': 836,
 'июль 2013': 7348,
 '2013 год': 560,
 'год сумма': 4681,
 'получать контроль': 13267,
 'пакет акция': 12221,
 '2008 год': 542,
 'год однако': 4541,
 'однако затем': 11302,
 'процент доля': 14824,
 'настоящий время': 10187,
 'контрольный пакет': 8023,
 'который владеть': 8134,
 '2004 год': 534,
 'год купить': 4499,
 'миллион доллар': 9420,
 'финансовый организация': 19979,
 'организация россия': 11673,
 '1995 год': 484,
 'год февраль': 4706,
 'февраль 2011': 19865,
 '2011 год': 552,
 'год продавать': 4607,
 '2012 год': 556,
 'год составлять': 4664,
 'миллиард рубль': 9412,
 'год данные': 4439,
 'данные компания': 5074,
 'красный площадь': 8436,
 'около 15': 11407,
 '15 миллион': 213,
 'миллион человек': 9430,
 'человек год': 20417,
 'продолжаться': 14538,
 'сегодня': 16642,
 'столица': 18179,
 'судебный': 18409,
 'заседание': 6458,
 'дело': 5247,
 'россиянин': 16045,
 'обвиняемый': 10956,
 'покушение': 13137,
 'показание': 13108,
 'последний': 13486,
 'свидетель': 16419,
 'обвинение': 10938,
 'интерфакс': 7084,
 'ссылка': 18003,
 'адвокат': 1837,
 'дмитрий': 5524,
 'состав': 17599,
 'рабочий': 15070,
 'оказывать': 11376,
 'юридический': 21121,
 'соотечественник': 17573,
 'ход': 20175,
 'сегодняшний': 16643,
 'допрашивать': 5756,
 'работник': 15068,
 'правоохранительный': 13750,
 'орган': 11648,
 'участвовать': 19740,
 'следственный': 17013,
 'действие': 5191,
 'суд': 18365,
 'напоминать': 10099,
 'двое': 5141,
 'сотрудник': 17713,
 'спецслужба': 17827,
 'анатолий': 2051,
 'василий': 2848,
 'арестовывать': 2170,
 'доха': 5814,
 'ночь': 10859,
 '19': 333,
 'вместе': 3277,
 'задерживать': 6197,
 'секретарь': 16655,
 'посольство': 13528,
 'рф': 16148,
 'александр': 1931,
 'обладать': 10998,
 'дипломатический': 5483,
 'неприкосновенность': 10565,
 'впоследствии': 3619,
 'освобождать': 11721,
 '24': 691,
 'марта': 9074,
 'вернуться': 2938,
 'родина': 15785,
 'продолжать': 14532,
 'настаивать': 10183,
 'невиновность': 10377,
 'гражданин': 4892,
 'судебный заседание': 18410,
 'заседание дело': 6460,
 'сообщать агентство': 17450,
 'агентство интерфакс': 1807,
 'интерфакс ссылка': 7094,
 'ссылка адвокат': 18005,
 'рабочий группа': 15071,
 'правоохранительный орган': 13751,
 'орган который': 11654,
 'который участвовать': 8393,
 'следственный действие': 17015,
 'двое сотрудник': 5146,
 'сотрудник российский': 17732,
 'российский спецслужба': 15913,
 '19 февраль': 349,
 'первый секретарь': 12400,
 'посольство рф': 13530,
 'вернуться родина': 2940,
 'свой гражданин': 16467,
 'nasa': 1428,
 'называть': 9996,
 'семь': 16691,
 'плохой': 12697,
 'хороший': 20230,
 'точка': 19020,
 'зрение': 6719,
 'достоверность': 5799,
 'фильм': 19951,
 'the': 1579,
 'sunday': 1567,
 'times': 1601,
 'объявление': 11205,
 'картина': 7512,
 'состояться': 17667,
 'прессконференция': 14067,
 'проходить': 14780,
 'лаборатория': 8631,
 'реактивный': 15493,
 'движение': 5133,
 'мнение': 9587,
 'представлять': 13924,
 'технология': 18908,
 'выглядеть': 3889,
 'следующий': 17026,
 'земной': 6663,
 'ядро': 21168,
 'вулкан': 3830,
 'day': 1246,
 'покрывать': 13132,
 'тайный': 18615,
 'we': 1642,
 'перечисленный': 12533,
 'удостаиваться': 19408,
 'попадание': 13398,
 'список': 17843,
 'благодаря': 2516,
 'количество': 7744,
 'научный': 10214,
 'пора': 13428,
 'совершенный': 17283,
 'например': 10114,
 'условие': 19628,
 'нейтральный': 10467,
 'частица': 20379,
 'взаимодействовать': 3083,
 'материя': 9120,
 'примечательно': 14275,
 'принимать': 14288,
 'косвенный': 8106,
 'участие': 19743,
 'создание': 17388,
 'автор': 1776,
 'изначально': 6888,
 'космический': 8109,
 'ответ': 11845,
 'переставать': 12520,
 'устраивать': 19681,
 'кинематографист': 7625,
 'заканчивать': 6239,
 'специалист': 17810,
 'получаться': 13304,
 'кроме': 8496,
 'род': 15783,
 'теория': 18837,
 'показывать': 13114,
 'контакт': 7994,
 'день': 5311,
 'останавливаться': 11813,
 'земля': 6661,
 'женщина': 6011,
 'луна': 8889,
 'in': 1336,
 'нечто': 10658,
 'иной': 7022,
 'world': 1654,
 'парк': 12268,
 'период': 12535,
 'park': 1467,
 'точка зрение': 19021,
 'последний год': 13490,
 'год сообщать': 4659,
 'сообщать the': 17448,
 'the sunday': 1592,
 'sunday times': 1568,
 'мнение ученый': 9600,
 'выглядеть следующий': 3890,
 'следующий образ': 17033,
 'большой количество': 2632,
 'участие создание': 19757,
 'космический агентство': 8110,
 'однако время': 11299,
 'слово ученый': 17087,
 'кроме это': 8505,
 'фильм который': 19953,
 'который мнение': 8203,
 'in the': 1337,
 'выходить': 4090,
 'союз': 17777,
 'отечество': 11894,
 'эстония': 20940,
 'организовывать': 11684,
 'эстонский': 20941,
 'националистический': 10269,
 'националист': 10268,
 'наступать': 10195,
 'раскол': 15355,
 'кость': 8121,
 'бронзовый': 2724,
 'солдат': 17410,
 'заниматься': 6366,
 'накануне': 10020,
 'выборы': 3858,
 'надежда': 9964,
 'набирать': 9931,
 'голос': 4748,
 'ошибка': 12200,
 'исправлять': 7250,
 'сожаление': 17373,
 'невозможно': 10379,
 'оставаться': 11795,
 'лишь': 8838,
 'надеяться': 9969,
 'монстр': 9686,
 'умирать': 19526,
 'цитировать': 20351,
 'лидер': 8768,
 'delfi': 1251,
 'призывать': 14234,
 'массовый': 9092,
 '22': 637,
 'приглашать': 14174,
 'премьерминистр': 14030,
 'республика': 15685,
 'речь': 15716,
 'снова': 17229,
 'призыв': 14233,
 'демонтаж': 5298,
 'памятник': 12244,
 'советский': 17301,
 'май': 8935,
 'осужденный': 11824,
 'судить': 18421,
 'измена': 6875,
 'подготовить': 12850,
 'документ': 5589,
 'активный': 1902,
 'участник': 19760,
 'независимость': 10432,
 '1980х': 449,
 'почетный': 13660,
 'создаваемый': 17376,
 'удаление': 19374,
 'находиться': 10227,
 'монумент': 9688,
 'обещать': 10982,
 'годовщина': 4728,
 'символизировать': 16855,
 'оккупация': 11394,
 'очередь': 12188,
 'отказываться': 11903,
 'демонтировать': 5299,
 'вызывать': 3923,
 'недовольство': 10412,
 'который это': 8400,
 'это заниматься': 20977,
 'самый дело': 16295,
 'оставаться лишь': 11797,
 '22 сентябрь': 651,
 'сообщаться ранее': 17532,
 '10 май': 29,
 'май это': 8958,
 'активный участник': 1904,
 '1980х год': 450,
 'год заявлять': 4472,
 'свой очередь': 16513,
 'вызывать недовольство': 3926,
 'people': 1472,
 'рейтинг': 15636,
 'часть': 20395,
 'тело': 18806,
 'голливудский': 4740,
 'звезда': 6631,
 'variety': 1624,
 'обладательница': 10997,
 'нога': 10818,
 'голливуд': 4739,
 'николь': 10701,
 'статья': 18116,
 'упражнение': 19589,
 'проводить': 14458,
 'половина': 13220,
 'жизнь': 6047,
 'ходить': 20205,
 'пешком': 12584,
 'плавать': 12637,
 'бег': 2391,
 'целое': 20286,
 'здоровый': 6650,
 'среди': 17945,
 'знаменитость': 6692,
 'бывший': 2765,
 'муж': 9855,
 'обладатель': 10995,
 'красивый': 8424,
 'рука': 16107,
 'круз': 8512,
 'теннис': 18826,
 'патрик': 12315,
 'мужчина': 9860,
 'грудь': 4956,
 'лауреат': 8654,
 'оскар': 11738,
 'мужской': 9857,
 'актер': 1887,
 'живот': 6038,
 'певец': 12331,
 'джерри': 5420,
 'слух': 17119,
 'поддержание': 12860,
 'форма': 20033,
 'делать': 5239,
 'тысяча': 19214,
 'пресса': 14064,
 'номинация': 10830,
 'часть тело': 20404,
 'сообщать variety': 17449,
 'здоровый образ': 6651,
 'образ жизнь': 11087,
 'хороший мужской': 20233,
 'каждый день': 7408,
 'номинация хороший': 10831,
 'energy': 1270,
 'планировать': 12650,
 'аукцион': 2268,
 'земельный': 6657,
 'участок': 19773,
 'краснодар': 8427,
 'акционер': 1910,
 'писать': 12602,
 'газета': 4142,
 'рбк': 15485,
 'торги': 18993,
 'выставлять': 4059,
 'офшорный': 12148,
 'право': 13731,
 'гектар': 4200,
 'сочи': 17774,
 'намечать': 10062,
 '14': 170,
 'июнь': 7364,
 'решение': 15728,
 'объясняться': 11227,
 'цена': 20293,
 'лот': 8868,
 'пока': 13079,
 'определять': 11599,
 'выручать': 4008,
 'менее': 9254,
 'покупка': 13136,
 'гостиница': 4836,
 'улица': 19503,
 'тогдашний': 18960,
 'совладелец': 17306,
 '2007': 539,
 'подконтрольный': 12884,
 'бизнесмен': 2493,
 'russian': 1523,
 'land': 1372,
 'числиться': 20596,
 'сити': 16902,
 '2009': 545,
 'погашение': 12773,
 'долг': 5603,
 'кризис': 8467,
 'большинство': 2621,
 'частность': 20382,
 'особняк': 11783,
 'house': 1327,
 'лондон': 8858,
 'нефтяник': 10650,
 'отходить': 12102,
 'вилла': 3168,
 '250': 734,
 'продавать аукцион': 14507,
 'земельный участок': 6658,
 'акционер компания': 1911,
 'это писать': 21012,
 'писать газета': 12608,
 'газета рбк': 4159,
 'участок площадь': 19775,
 '14 июнь': 176,
 'июнь год': 7378,
 'год решение': 4630,
 'компания являться': 7873,
 'пока определять': 13093,
 'менее 10': 9255,
 'который планироваться': 8261,
 'планироваться построить': 12659,
 'процент компания': 14830,
 'компания объявлять': 7848,
 '2007 год': 540,
 'год среди': 4670,
 '2009 год': 546,
 'погашение долг': 12774,
 'также сообщаться': 18699,
 '250 миллион': 735,
 'градостроительный': 4888,
 'совет': 17288,
 'санктпетербург': 16322,
 'одобрять': 11356,
 'концепция': 8041,
 'строительство': 18316,
 'район': 15244,
 'малый': 9000,
 'газпром': 4174,
 'должно': 5612,
 'располагаться': 15378,
 'огромный': 11275,
 'небоскреб': 10371,
 'главный': 4328,
 'архитектор': 2215,
 'обсуждение': 11132,
 'приходить': 14376,
 'вывод': 3879,
 'необходимо': 10510,
 'развивать': 15130,
 'создавать': 17377,
 'архитектурный': 2217,
 'добавлять': 5541,
 'вполне': 3617,
 'возможно': 3455,
 'нужно': 10906,
 'посмотреть': 13520,
 'масштабный': 9108,
 'соотношение': 17575,
 'объект': 11191,
 'основной': 11762,
 'пространство': 14710,
 'изза': 6848,
 'центр': 20311,
 'всемирный': 3718,
 'фонд': 20019,
 'включать': 3210,
 'исторический': 7278,
 'линия': 8798,
 'наследие': 10177,
 'особый': 11788,
 'опасность': 11537,
 'многий': 9604,
 'петербуржец': 12567,
 'испортить': 7244,
 'северный': 16617,
 'любой': 8908,
 'город': 4776,
 'штабквартира': 20748,
 'поскольку': 13481,
 'застройка': 6478,
 'постепенно': 13572,
 'меняться': 9261,
 'офисный': 12118,
 'здание': 6643,
 'занимать': 6353,
 'спортивный': 17861,
 'культурный': 8582,
 'комплекс': 7881,
 'музей': 9865,
 'современный': 17319,
 'искусство': 7203,
 'зал': 6295,
 'предполагаться': 13845,
 'офис': 12116,
 '16': 240,
 '35': 896,
 'отводить': 11865,
 'общественный': 11155,
 'функция': 20102,
 '49': 976,
 'разнообразный': 15200,
 'бизнесцентр': 2494,
 'это сообщать': 21045,
 'слово главный': 17055,
 'главный архитектор': 4329,
 'приходить вывод': 14379,
 'также добавлять': 18629,
 'мнение специалист': 9599,
 'компания газпром': 7838,
 'являться крупный': 21147,
 'крупный компания': 8521,
 'офисный здание': 12119,
 'также планироваться': 18662,
 'планироваться создавать': 12662,
 'музей современный': 9866,
 'современный искусство': 17320,
 '16 процент': 253,
 'процент общий': 14838,
 'общий площадь': 11174,
 '35 процент': 900,
 '49 процент': 977,
 'полугодие': 13244,
 '2017': 576,
 'нефть': 10645,
 'сокращение': 17407,
 'добыча': 5557,
 'диапазон': 5458,
 'баррель': 2363,
 'глава': 4280,
 'лукойл': 8888,
 'эфир': 21067,
 'телеканал': 18780,
 'уверенный': 19320,
 'близкий': 2534,
 'коридор': 8073,
 'реальный': 15508,
 'далеко': 5045,
 'второй': 3807,
 'зависеть': 6156,
 'насколько': 10175,
 'рынок': 16170,
 'сказать': 16917,
 'исключать': 7189,
 'понадобиться': 13353,
 'ввод': 2861,
 'запас': 6392,
 'накапливаться': 10022,
 'снижаться': 17212,
 'опек': 11540,
 'выполнять': 3971,
 'обязательство': 11244,
 'случай': 17121,
 'наращивание': 10122,
 'истекать': 7270,
 'срок': 17981,
 'договоренность': 5573,
 'увеличение': 19305,
 'согласованный': 17346,
 'повлиять': 12748,
 'наоборот': 10074,
 'направлять': 10108,
 'стабилизация': 18027,
 'январь': 21186,
 'снижение': 17213,
 'указание': 19434,
 'минэнерго': 9513,
 'наш': 10357,
 'общероссийский': 11152,
 'реализовывать': 15502,
 'остановка': 11815,
 'скважина': 16944,
 'смочь': 17183,
 'быстро': 2798,
 'вводить': 2862,
 'эксплуатация': 20848,
 'влиять': 3272,
 'технологический': 18906,
 'процесс': 14874,
 'стабильность': 18031,
 'работа': 15045,
 'месторождение': 9338,
 '150': 224,
 'рамка': 15278,
 'ограничение': 11268,
 'вступать': 3766,
 'сила': 16829,
 'действовать': 5206,
 'полгода': 13145,
 'встреча': 3748,
 'пройти': 14638,
 'целесообразность': 20283,
 'продление': 14525,
 'начало': 10292,
 'декабрь': 5213,
 'саммит': 16251,
 'вена': 2920,
 'член': 20621,
 'картель': 7510,
 'обязываться': 11247,
 'сутки': 18458,
 'первый полугодие': 12389,
 '2017 год': 577,
 'год цена': 4713,
 'цена нефть': 20299,
 'доллар баррель': 5666,
 'это заявлять': 20979,
 'заявлять глава': 6557,
 'эфир телеканал': 21071,
 'телеканал россия': 18788,
 'россия 24': 15934,
 'близкий время': 2536,
 'сказать это': 16929,
 'год снижаться': 4654,
 'весь страна': 3041,
 'истекать срок': 7271,
 'действие который': 5195,
 'отмечать глава': 11970,
 'отмечать весь': 11967,
 'весь российский': 3032,
 'российский нефтяной': 15891,
 '15 процент': 217,
 'который смочь': 8356,
 'вводить эксплуатация': 2872,
 'который сегодня': 8349,
 '10 январь': 43,
 'январь сообщаться': 21205,
 'добыча нефть': 5559,
 '150 тысяча': 226,
 'тысяча баррель': 19216,
 'баррель день': 2364,
 'вступать сила': 3768,
 'январь 2017': 21200,
 'год действовать': 4441,
 'участник встреча': 19762,
 'принимать решение': 14305,
 'россия страна': 16028,
 'начало декабрь': 10308,
 '12 миллион': 115,
 'миллион баррель': 9417,
 'баррель сутки': 2366,
 'генеральный': 4211,
 'директор': 5490,
 'nokia': 1452,
 'отправлять': 12036,
 'отставка': 12076,
 '21': 607,
 'официальный': 12127,
 'прессрелиз': 14068,
 'прийти': 14238,
 'руководитель': 16110,
 'microsoft': 1413,
 'стивен': 18144,
 'stephen': 1557,
 'пост': 13538,
 'председатель': 13862,
 'президент': 13961,
 'производитель': 14592,
 'мобильный': 9628,
 'телефон': 18800,
 'причина': 14391,
 'смартфон': 17141,
 'биржа': 2505,
 '20': 495,
 'ньюйоркский': 10923,
 'упасть': 19551,
 '40': 930,
 'руководящий': 16127,
 'должность': 5618,
 'ряд': 16186,
 'поработать': 13432,
 'прорабатывать': 14687,
 'искать': 7188,
 'замена': 6310,
 'известно': 6801,
 'изменение': 6876,
 'руководство': 16121,
 'конец': 7910,
 'намерение': 10058,
 'очередной': 12187,
 'реструктуризация': 15701,
 'бизнес': 2491,
 'подразделение': 12951,
 'сфера': 18474,
 'деятельность': 5402,
 'генеральный директор': 4213,
 'директор компания': 5493,
 'отправлять отставка': 12038,
 '21 сентябрь': 622,
 'сентябрь это': 16734,
 'это сообщаться': 21046,
 'сообщаться официальный': 17530,
 'официальный прессрелиз': 12141,
 'бывший руководитель': 2789,
 'занимать пост': 6360,
 'пост председатель': 13546,
 'председатель совет': 13871,
 'совет директор': 17290,
 'крупный мир': 8522,
 'мир производитель': 9521,
 'мобильный телефон': 9632,
 'причина отставка': 14402,
 'доля компания': 5705,
 'год стоимость': 4674,
 'стоимость акция': 18161,
 '20 процент': 510,
 'процент стоимость': 14863,
 '40 процент': 937,
 'процент ранее': 14848,
 'американский компания': 2014,
 '30 год': 833,
 'год занимать': 4465,
 'пост глава': 13539,
 'глава компания': 4292,
 'становиться известно': 18065,
 'июль 2010': 7345,
 'год сообщаться': 4660,
 'руководство компания': 16123,
 'конец июль': 7930,
 'объявлять намерение': 11211,
 'число': 20598,
 'несовершеннолетний': 10603,
 'наркоман': 10125,
 'увеличиваться': 19314,
 '60': 1022,
 'безопасность': 2406,
 'николай': 10696,
 'патрушев': 12323,
 'совещание': 17305,
 'тасс': 18737,
 'уточнять': 19707,
 'приводить': 14155,
 'данный': 5101,
 'статистика': 18111,
 'попрежнему': 13414,
 'характеризоваться': 20143,
 'тяжелый': 19258,
 'употреблять': 19564,
 'уменьшаться': 19521,
 'течение': 18910,
 '2016': 572,
 'изымать': 6920,
 'наркотик': 10126,
 'совершать': 17267,
 '201': 547,
 'преступление': 14099,
 'связывать': 16567,
 'насчитываться': 10200,
 '165': 265,
 'преступник': 14106,
 'незаконный': 10441,
 'оборот': 11072,
 'запрещать': 6420,
 'вещество': 3077,
 'совбез': 17265,
 'низкий': 10675,
 'эффективность': 21075,
 ...}

Preparation

In [ ]:
def vect2gensim(vectorizer, dtmatrix):
     # transform sparse matrix into gensim corpus and dictionary
    corpus_vect_gensim = gensim.matutils.Sparse2Corpus(dtmatrix, documents_columns=False)
    dictionary = gensim.corpora.dictionary.Dictionary.from_corpus(corpus_vect_gensim,
        id2word=dict((id, word) for word, id in vectorizer.vocabulary_.items()))

    return (corpus_vect_gensim, dictionary)
In [ ]:
(gensim_corpus, gensim_dict) = vect2gensim(vectorizer, matrix)
In [ ]:
def corpus2words_lists(gensim_corpus,gensim_dict):

  #Converts corpus to texts in the form of words lists for gensim Coherence model 

  dictionary = dict(gensim_dict)
  corpus_list = list(gensim_corpus)

  texts_new = []
  for text_meta in corpus_list:
    text_new=[]
    for pair in text_meta:
      for counter in range(1,pair[1]+1):
        text_new.append(dictionary[pair[0]])
    texts_new.append(text_new)

  return texts_new
In [ ]:
data_words = corpus2words_lists(gensim_corpus,gensim_dict)

Firstly, I want to check the LSA model

In [ ]:
%%time
# Build LSA model
lsamodel = gensim.models.LsiModel(gensim_corpus, num_topics=15, id2word = gensim_dict,power_iters=5)
CPU times: user 50.7 s, sys: 5.18 s, total: 55.9 s
Wall time: 41.2 s
In [ ]:
# Compute Coherence Score
coherence_model_lsa = CoherenceModel(model=lsamodel, texts=data_words, dictionary=gensim_dict, coherence='c_v')
coherence_lsa = coherence_model_lsa.get_coherence()
print('Coherence Score: ', coherence_lsa)
Coherence Score:  0.495504629954695

This score is not good, let's optimize the number of topics.

In [ ]:
%%time
warnings.filterwarnings("ignore")
numbers = [10,15,18,20,25]

coherences = []
for num_topics in tqdm_notebook(numbers):
  
  lsamodel = gensim.models.LsiModel(gensim_corpus, 
                                    num_topics=num_topics, 
                                    id2word = gensim_dict,
                                    power_iters=2)

  coherence_model_lsa = CoherenceModel(model=lsamodel, texts=data_words, dictionary=gensim_dict, coherence='c_v')
  coherences.append(coherence_model_lsa.get_coherence())
CPU times: user 9min 59s, sys: 17.7 s, total: 10min 17s
Wall time: 9min 30s
In [ ]:
plt.plot(numbers,coherences)
plt.title('LSA model optimization')
plt.xlabel('Number of topics')
plt.ylabel('Coherence score')
plt.grid(True)
In [ ]:
%%time
best_lsamodel = gensim.models.LsiModel(gensim_corpus, num_topics=5, id2word = gensim_dict,power_iters=30)
CPU times: user 3min 18s, sys: 20.7 s, total: 3min 39s
Wall time: 2min 46s

That's better, let's see the coherence score and the most important words

In [ ]:
# Compute Coherence Score
coherence_model_lsa = CoherenceModel(model=best_lsamodel, texts=data_words, dictionary=gensim_dict, coherence='c_v')
coherence_lsa = coherence_model_lsa.get_coherence()
print('Coherence Score: ', coherence_lsa)
Coherence Score:  0.6340427513575773
In [ ]:
pprint(best_lsamodel.print_topics())
[(0,
  '0.218*"процент" + 0.185*"компания" + 0.151*"президент" + 0.149*"доллар" + '
  '0.139*"тысяча" + 0.132*"миллион" + 0.125*"рубль" + 0.119*"сша" + '
  '0.119*"дело" + 0.106*"миллиард"'),
 (1,
  '-0.541*"процент" + -0.260*"доллар" + -0.202*"компания" + -0.199*"рубль" + '
  '-0.191*"миллиард" + 0.162*"президент" + -0.160*"составлять" + '
  '-0.150*"миллион" + 0.137*"дело" + -0.104*"цена"'),
 (2,
  '-0.561*"процент" + -0.281*"президент" + 0.263*"компания" + 0.240*"миллион" '
  '+ 0.200*"доллар" + -0.181*"украина" + -0.148*"выборы" + 0.128*"рубль" + '
  '0.126*"тысяча" + 0.107*"суд"'),
 (3,
  '0.326*"процент" + -0.306*"доллар" + -0.239*"украина" + -0.224*"сша" + '
  '-0.214*"компания" + -0.213*"президент" + -0.193*"миллиард" + 0.179*"дело" + '
  '0.165*"рубль" + 0.147*"тысяча"'),
 (4,
  '-0.272*"дело" + -0.259*"суд" + 0.230*"матч" + -0.206*"рубль" + '
  '-0.192*"украина" + 0.173*"команда" + 0.155*"сборная" + 0.150*"игра" + '
  '0.143*"место" + -0.138*"миллиард"')]

We have comparatively high coherence, but the topics are not interpretive. Let's try more iterations and topics.

In [ ]:
best_lsamodel = gensim.models.LsiModel(gensim_corpus, num_topics=15, id2word = gensim_dict,power_iters=30)
pprint(best_lsamodel.print_topics())
[(0,
  '0.218*"процент" + 0.185*"компания" + 0.151*"президент" + 0.149*"доллар" + '
  '0.139*"тысяча" + 0.133*"миллион" + 0.125*"рубль" + 0.119*"сша" + '
  '0.119*"дело" + 0.106*"миллиард"'),
 (1,
  '-0.540*"процент" + -0.261*"доллар" + -0.203*"компания" + -0.198*"рубль" + '
  '-0.190*"миллиард" + 0.161*"президент" + -0.160*"составлять" + '
  '-0.150*"миллион" + 0.137*"дело" + -0.104*"цена"'),
 (2,
  '-0.556*"процент" + -0.284*"президент" + 0.260*"компания" + 0.237*"миллион" '
  '+ -0.194*"украина" + 0.193*"доллар" + -0.143*"выборы" + 0.131*"тысяча" + '
  '0.127*"рубль" + -0.106*"глава"'),
 (3,
  '0.338*"процент" + -0.309*"доллар" + -0.239*"украина" + -0.225*"сша" + '
  '-0.219*"компания" + -0.210*"президент" + -0.196*"миллиард" + 0.173*"дело" + '
  '0.155*"рубль" + -0.146*"миллиард доллар"'),
 (4,
  '-0.259*"суд" + -0.256*"дело" + 0.233*"матч" + -0.220*"рубль" + '
  '-0.200*"украина" + 0.176*"команда" + 0.157*"сборная" + 0.152*"игра" + '
  '0.142*"место" + -0.141*"миллиард"'),
 (5,
  '0.281*"рубль" + -0.281*"сша" + 0.271*"матч" + 0.195*"команда" + '
  '-0.187*"компания" + 0.182*"сборная" + 0.166*"украина" + '
  '-0.151*"американский" + 0.145*"счет" + -0.140*"процент"'),
 (6,
  '0.486*"компания" + -0.336*"тысяча" + -0.259*"рубль" + 0.253*"суд" + '
  '0.186*"дело" + 0.172*"процент" + -0.138*"украина" + -0.127*"доллар" + '
  '0.122*"акция" + -0.109*"миллион"'),
 (7,
  '0.408*"доллар" + -0.405*"компания" + 0.247*"сша" + 0.207*"дело" + '
  '0.188*"суд" + -0.179*"проект" + -0.160*"тысяча" + 0.120*"миллиард доллар" + '
  '0.114*"американский" + 0.110*"миллион доллар"'),
 (8,
  '0.565*"украина" + -0.276*"сша" + -0.255*"президент" + -0.254*"рубль" + '
  '0.215*"украинский" + 0.168*"газ" + 0.117*"киев" + -0.108*"американский" + '
  '-0.099*"тысяча" + 0.098*"происходить"'),
 (9,
  '0.360*"миллиард" + -0.336*"миллион" + 0.292*"рубль" + -0.260*"тысяча" + '
  '0.187*"миллиард рубль" + 0.183*"банк" + -0.167*"миллион доллар" + '
  '-0.162*"доллар" + -0.136*"выборы" + 0.125*"самолет"'),
 (10,
  '0.301*"суд" + 0.290*"сша" + 0.255*"украина" + 0.242*"тысяча" + '
  '-0.240*"президент" + -0.223*"доллар" + -0.159*"выборы" + -0.140*"миллиард" '
  '+ 0.125*"американский" + 0.124*"военный"'),
 (11,
  '0.284*"компания" + -0.259*"фильм" + 0.222*"президент" + 0.160*"матч" + '
  '0.159*"сша" + -0.158*"the" + -0.146*"работа" + 0.128*"москва" + '
  '0.122*"тысяча" + -0.117*"ученый"'),
 (12,
  '0.286*"суд" + -0.226*"президент" + -0.222*"дело" + -0.198*"миллион" + '
  '0.189*"власть" + 0.188*"партия" + 0.172*"решение" + 0.168*"тысяча" + '
  '0.165*"акция" + 0.158*"выборы"'),
 (13,
  '0.247*"рубль" + -0.246*"самолет" + -0.237*"миллион" + 0.195*"компания" + '
  '0.191*"тысяча" + -0.187*"проект" + 0.173*"акция" + 0.138*"полиция" + '
  '-0.135*"суд" + 0.131*"банк"'),
 (14,
  '-0.306*"партия" + -0.275*"выборы" + -0.264*"самолет" + -0.238*"миллион" + '
  '-0.226*"рубль" + 0.162*"москва" + 0.146*"грузия" + -0.123*"украина" + '
  '-0.119*"сша" + 0.117*"доллар"')]

I think, that LSA model is not a good fit for our task. Let's try LDA model.

In [ ]:
%%time
# Build LDA model
warnings.filterwarnings("ignore")

lda_model = gensim.models.LdaMulticore(corpus=gensim_corpus,
                                           id2word=gensim_dict,
                                           num_topics=15, 
                                           random_state=100,                                           
                                           workers = 3,
                                            passes=1
                                        )
CPU times: user 2min 27s, sys: 2.25 s, total: 2min 29s
Wall time: 2min 45s
In [ ]:
# Compute Coherence Score
coherence_model_lda = CoherenceModel(model=lda_model, texts=data_words, dictionary=gensim_dict, coherence='c_v')
coherence_lda = coherence_model_lda.get_coherence()
print('Coherence Score: ', coherence_lda)
Coherence Score:  0.6333201191617532
In [ ]:
pprint(lda_model.print_topics())
[(0,
  '0.013*"матч" + 0.009*"команда" + 0.009*"сборная" + 0.008*"чемпионат" + '
  '0.006*"счет" + 0.006*"мир" + 0.005*"игра" + 0.005*"клуб" + 0.005*"место" + '
  '0.005*"победа"'),
 (1,
  '0.023*"процент" + 0.014*"компания" + 0.009*"миллион" + 0.008*"составлять" + '
  '0.008*"доллар" + 0.008*"тысяча" + 0.007*"миллиард" + 0.006*"рубль" + '
  '0.005*"рынок" + 0.004*"метр"'),
 (2,
  '0.011*"самолет" + 0.006*"военный" + 0.004*"ракета" + 0.004*"сша" + '
  '0.004*"аэропорт" + 0.004*"город" + 0.003*"сирия" + 0.003*"авиакомпания" + '
  '0.003*"американский" + 0.003*"корабль"'),
 (3,
  '0.007*"происходить" + 0.006*"результат" + 0.005*"погибать" + '
  '0.005*"находиться" + 0.004*"взрыв" + 0.004*"пожар" + 0.004*"город" + '
  '0.004*"около" + 0.004*"район" + 0.004*"пострадать"'),
 (4,
  '0.011*"фильм" + 0.006*"the" + 0.006*"игра" + 0.004*"картина" + '
  '0.004*"компания" + 0.004*"роль" + 0.004*"проект" + 0.004*"выходить" + '
  '0.004*"американский" + 0.004*"режиссер"'),
 (5,
  '0.006*"украина" + 0.006*"дело" + 0.005*"глава" + 0.005*"рубль" + 0.004*"рф" '
  '+ 0.004*"президент" + 0.004*"служба" + 0.003*"министр" + 0.003*"украинский" '
  '+ 0.003*"федеральный"'),
 (6,
  '0.007*"миллион" + 0.004*"клуб" + 0.004*"группа" + 0.004*"the" + '
  '0.003*"доллар" + 0.003*"альбом" + 0.003*"премия" + 0.003*"издание" + '
  '0.003*"тысяча" + 0.003*"театр"'),
 (7,
  '0.006*"полиция" + 0.005*"задерживать" + 0.005*"дело" + 0.005*"сотрудник" + '
  '0.004*"мужчина" + 0.004*"происходить" + 0.004*"находиться" + '
  '0.004*"убийство" + 0.003*"город" + 0.003*"ребенок"'),
 (8,
  '0.005*"сша" + 0.005*"власть" + 0.004*"правительство" + 0.004*"израиль" + '
  '0.003*"турция" + 0.003*"организация" + 0.003*"ирак" + 0.003*"против" + '
  '0.003*"государство" + 0.003*"территория"'),
 (9,
  '0.010*"ученый" + 0.004*"автомобиль" + 0.003*"результат" + '
  '0.003*"исследование" + 0.003*"животное" + 0.003*"обнаруживать" + '
  '0.003*"работа" + 0.003*"исследователь" + 0.003*"происходить" + '
  '0.003*"опубликовывать"'),
 (10,
  '0.014*"президент" + 0.006*"украина" + 0.006*"сша" + 0.006*"глава" + '
  '0.006*"выборы" + 0.005*"путин" + 0.004*"лидер" + 0.004*"партия" + '
  '0.004*"государство" + 0.004*"вопрос"'),
 (11,
  '0.013*"суд" + 0.008*"дело" + 0.005*"решение" + 0.004*"бывший" + '
  '0.003*"обвинение" + 0.003*"сша" + 0.003*"глава" + 0.003*"москва" + '
  '0.003*"адвокат" + 0.003*"президент"'),
 (12,
  '0.009*"украина" + 0.008*"газ" + 0.005*"процент" + 0.005*"компания" + '
  '0.004*"газпром" + 0.003*"украинский" + 0.003*"цена" + 0.003*"поставка" + '
  '0.003*"тысяча" + 0.003*"принимать"'),
 (13,
  '0.008*"компания" + 0.007*"пользователь" + 0.006*"сеть" + 0.006*"сайт" + '
  '0.005*"тысяча" + 0.004*"система" + 0.003*"сервис" + 0.003*"программа" + '
  '0.003*"работа" + 0.003*"устройство"'),
 (14,
  '0.011*"доллар" + 0.010*"банк" + 0.010*"процент" + 0.010*"миллиард" + '
  '0.008*"рубль" + 0.006*"нефть" + 0.005*"компания" + 0.005*"рынок" + '
  '0.004*"миллиард доллар" + 0.004*"финансовый"')]

We have much better quality. Let's optimize.

In [ ]:
%%time
warnings.filterwarnings("ignore")
numbers = [10,15,18,20,25]

coherences = []
for num_topics in tqdm_notebook(numbers):
  

  lda_model = gensim.models.LdaMulticore(corpus=gensim_corpus,
                                           id2word=gensim_dict,
                                           num_topics=num_topics, 
                                           random_state=100,                                           
                                           workers = 3,
                                            passes=1
                                        )
  coherence_model_lda = CoherenceModel(model=lda_model, texts=data_words, dictionary=gensim_dict, coherence='c_v')
  coherences.append(coherence_model_lda.get_coherence())
CPU times: user 23min 10s, sys: 10.3 s, total: 23min 20s
Wall time: 24min 31s
In [ ]:
plt.plot(numbers,coherences)
plt.title('LDA model optimization')
plt.xlabel('Number of topics')
plt.ylabel('Coherence score')
plt.grid(True)

We know, that 10 topics is too little, that is why I will choose 20 topics and see results.

In [ ]:
%%time
best_lda_model = gensim.models.LdaMulticore(corpus=gensim_corpus,
                                           id2word=gensim_dict,
                                           num_topics=20, 
                                           random_state=100,                                           
                                           workers = 3,
                                            passes=5
                                        )
CPU times: user 11min 23s, sys: 7.03 s, total: 11min 30s
Wall time: 11min 57s
In [ ]:
# Compute Coherence Score
coherence_model_lda = CoherenceModel(model=best_lda_model, texts=data_words, dictionary=gensim_dict, coherence='c_v')
coherence_lda = coherence_model_lda.get_coherence()
print('Coherence Score: ', coherence_lda)
Coherence Score:  0.6709457821930502
In [ ]:
pprint(best_lda_model.print_topics())
[(0,
  '0.014*"мир" + 0.009*"олимпийский" + 0.008*"спортсмен" + 0.008*"место" + '
  '0.007*"бой" + 0.007*"победа" + 0.007*"чемпион" + 0.007*"чемпионат" + '
  '0.006*"конкурс" + 0.006*"международный"'),
 (1,
  '0.031*"процент" + 0.023*"тысяча" + 0.014*"составлять" + 0.013*"рубль" + '
  '0.011*"миллион" + 0.008*"метр" + 0.008*"квадратный" + 0.008*"москва" + '
  '0.007*"площадь" + 0.007*"квадратный метр"'),
 (2,
  '0.016*"военный" + 0.007*"боевик" + 0.006*"сила" + 0.006*"войско" + '
  '0.005*"израиль" + 0.005*"сша" + 0.005*"сирия" + 0.005*"ирак" + '
  '0.005*"армия" + 0.005*"американский"'),
 (3,
  '0.009*"происходить" + 0.009*"самолет" + 0.007*"результат" + '
  '0.007*"погибать" + 0.007*"находиться" + 0.006*"взрыв" + 0.006*"аэропорт" + '
  '0.005*"город" + 0.005*"пассажир" + 0.005*"пострадать"'),
 (4,
  '0.020*"фильм" + 0.011*"игра" + 0.008*"the" + 0.007*"роль" + '
  '0.007*"выходить" + 0.007*"картина" + 0.007*"актер" + 0.006*"режиссер" + '
  '0.006*"американский" + 0.005*"главный"'),
 (5,
  '0.006*"глава" + 0.006*"рф" + 0.006*"закон" + 0.006*"правительство" + '
  '0.006*"федеральный" + 0.005*"документ" + 0.005*"президент" + '
  '0.004*"владимир" + 0.004*"область" + 0.004*"государственный"'),
 (6,
  '0.006*"группа" + 0.006*"премия" + 0.005*"музей" + 0.005*"книга" + '
  '0.004*"песня" + 0.004*"театр" + 0.004*"the" + 0.004*"альбом" + '
  '0.004*"работа" + 0.004*"музыкант"'),
 (7,
  '0.010*"полиция" + 0.008*"сотрудник" + 0.008*"задерживать" + 0.006*"мужчина" '
  '+ 0.005*"происходить" + 0.005*"орган" + 0.005*"дело" + '
  '0.005*"правоохранительный" + 0.005*"правоохранительный орган" + '
  '0.005*"полицейский"'),
 (8,
  '0.007*"власть" + 0.006*"британский" + 0.005*"великобритания" + 0.004*"the" '
  '+ 0.004*"германия" + 0.003*"ребенок" + 0.003*"тысяча" + 0.003*"город" + '
  '0.003*"женщина" + 0.003*"случай"'),
 (9,
  '0.012*"ученый" + 0.006*"система" + 0.006*"животное" + 0.005*"обнаруживать" '
  '+ 0.005*"исследование" + 0.005*"космический" + 0.005*"работа" + '
  '0.004*"земля" + 0.004*"исследователь" + 0.004*"аппарат"'),
 (10,
  '0.021*"президент" + 0.015*"сша" + 0.007*"глава" + 0.006*"путин" + '
  '0.005*"государство" + 0.005*"министр" + 0.005*"вопрос" + '
  '0.004*"американский" + 0.004*"грузия" + 0.004*"отношение"'),
 (11,
  '0.027*"суд" + 0.018*"дело" + 0.008*"обвинение" + 0.007*"бывший" + '
  '0.006*"признавать" + 0.006*"адвокат" + 0.006*"уголовный" + 0.006*"решение" '
  '+ 0.005*"следствие" + 0.005*"иск"'),
 (12,
  '0.014*"процент" + 0.007*"школа" + 0.006*"ребенок" + 0.005*"продукция" + '
  '0.005*"опрос" + 0.005*"бренд" + 0.005*"продукт" + 0.004*"россиянин" + '
  '0.004*"лентыр" + 0.004*"компания"'),
 (13,
  '0.013*"сеть" + 0.012*"пользователь" + 0.011*"сайт" + 0.008*"компания" + '
  '0.007*"интернет" + 0.006*"опубликовывать" + 0.006*"сервис" + 0.006*"видео" '
  '+ 0.006*"тысяча" + 0.005*"фотография"'),
 (14,
  '0.022*"процент" + 0.018*"банк" + 0.014*"доллар" + 0.012*"рубль" + '
  '0.009*"миллиард" + 0.007*"рынок" + 0.007*"финансовый" + 0.006*"рост" + '
  '0.006*"цена" + 0.006*"экономика"'),
 (15,
  '0.014*"газ" + 0.010*"нефть" + 0.009*"газпром" + 0.009*"корабль" + '
  '0.008*"поставка" + 0.007*"украина" + 0.006*"тонна" + 0.006*"ракета" + '
  '0.006*"море" + 0.005*"проект"'),
 (16,
  '0.021*"матч" + 0.015*"команда" + 0.013*"клуб" + 0.012*"сборная" + '
  '0.009*"счет" + 0.009*"чемпионат" + 0.006*"игра" + 0.006*"тренер" + '
  '0.006*"игрок" + 0.006*"футболист"'),
 (17,
  '0.012*"газета" + 0.011*"информация" + 0.010*"компания" + 0.009*"издание" + '
  '0.009*"журналист" + 0.007*"директор" + 0.006*"телеканал" + 0.006*"канал" + '
  '0.006*"работать" + 0.006*"сотрудник"'),
 (18,
  '0.028*"компания" + 0.019*"доллар" + 0.019*"миллион" + 0.016*"миллиард" + '
  '0.010*"миллион доллар" + 0.007*"миллиард доллар" + 0.007*"составлять" + '
  '0.006*"акция" + 0.006*"сумма" + 0.006*"проект"'),
 (19,
  '0.024*"украина" + 0.011*"украинский" + 0.011*"выборы" + 0.011*"партия" + '
  '0.009*"президент" + 0.007*"депутат" + 0.006*"глава" + 0.006*"киев" + '
  '0.005*"власть" + 0.005*"акция"')]

We have good topics. Let's see some pictures.

In [ ]:
def plot_difference(mdiff, title="", annotation=None):
    """Helper function to plot difference between models.

    Uses matplotlib as the backend."""
    
    fig, ax = plt.subplots(figsize=(18, 14))
    data = ax.imshow(mdiff, cmap='RdBu_r', origin='lower')
    plt.title(title)
    plt.colorbar(data)
In [ ]:
mdiff, annotation = best_lda_model.diff(best_lda_model, distance='jaccard', num_words=50)
plot_difference(mdiff, title="Topic difference (one model) [jaccard distance]", annotation=annotation)

Our topics are not dependent, but let's cut the number of topics to 15 further. Let's see the topics.

In [ ]:
# Visualize the topics
pyLDAvis.enable_notebook()
vis = pyLDAvis.gensim.prepare(best_lda_model, gensim_corpus, gensim_dict)
vis
Out[ ]:

Checking the parameters of The prior Dirichlet distribution.

In [ ]:
best_lda_model.alpha
Out[ ]:
array([0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05,
       0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05],
      dtype=float32)
In [ ]:
best_lda_model.eta
Out[ ]:
array([0.05, 0.05, 0.05, ..., 0.05, 0.05, 0.05], dtype=float32)

Good. Now, I want to tune parameters of the distributions to find the best sparsity.

In [ ]:
%%time
best_lda_model1 = gensim.models.LdaMulticore(corpus=gensim_corpus,
                                           id2word=gensim_dict,
                                           num_topics=15, 
                                           random_state=100,                                           
                                           workers = 3,
                                           passes=1                                   
                                        )
CPU times: user 2min 38s, sys: 2.31 s, total: 2min 40s
Wall time: 2min 56s
In [ ]:
best_lda_model1.alpha
Out[ ]:
array([0.06666667, 0.06666667, 0.06666667, 0.06666667, 0.06666667,
       0.06666667, 0.06666667, 0.06666667, 0.06666667, 0.06666667,
       0.06666667, 0.06666667, 0.06666667, 0.06666667, 0.06666667],
      dtype=float32)
In [ ]:
best_lda_model1.eta
Out[ ]:
array([0.06666667, 0.06666667, 0.06666667, ..., 0.06666667, 0.06666667,
       0.06666667], dtype=float32)
In [ ]:
data_list[0]
Out[ ]:
'крупный сша нефтяной компания сша exxonmobil помощь компания катар построить техас терминал сжижение дальнейший экспорт природный газ общий стоимость десять миллиард доллар соответствующий соглашение exxonmobil подписывать qatar petroleum international передавать bloomberg реализация проект сторона образовывать дочерний предприятие golden pass products llc фирма прошлый год получать разрешение экспорт спг страна который сша иметься соглашение свободный торговля прием спг терминал golden pass работать 2010 год планироваться ежегодный объем поставка спг построить терминал составлять 156 миллион тонна проект должный получать окончательный одобрение американский власть апрель сообщаться exxonmobil также собираться построить самый большой мир плавучий завод выпуск спг сотрудничество англоавстралийский горнодобывающий bhp billiton затрата указанный проект оценка эксперт превышать 12 миллиард доллар мощность спгзавод достигать шестисемь миллион тонна год'
In [ ]:
best_lda_model1.get_document_topics(gensim_corpus[0])
Out[ ]:
[(1, 0.2033212), (12, 0.06307592), (14, 0.72639567)]
In [ ]:
# Compute Coherence Score
coherence_model_lda1 = CoherenceModel(model=best_lda_model1, texts=data_words, dictionary=gensim_dict, coherence='c_v')
coherence_lda1 = coherence_model_lda1.get_coherence()
print('Coherence Score: ', coherence_lda1)
Coherence Score:  0.6323465150164217
In [ ]:
pprint(best_lda_model1.print_topics())
[(0,
  '0.013*"матч" + 0.010*"команда" + 0.009*"сборная" + 0.008*"чемпионат" + '
  '0.007*"счет" + 0.006*"игра" + 0.006*"мир" + 0.005*"победа" + 0.005*"место" '
  '+ 0.004*"второй"'),
 (1,
  '0.028*"процент" + 0.011*"компания" + 0.010*"тысяча" + 0.010*"миллион" + '
  '0.009*"составлять" + 0.008*"доллар" + 0.007*"рубль" + 0.005*"миллиард" + '
  '0.005*"метр" + 0.005*"рынок"'),
 (2,
  '0.012*"самолет" + 0.007*"военный" + 0.005*"сша" + 0.004*"ракета" + '
  '0.004*"аэропорт" + 0.004*"сирия" + 0.003*"американский" + 0.003*"город" + '
  '0.003*"авиакомпания" + 0.003*"находиться"'),
 (3,
  '0.006*"происходить" + 0.005*"результат" + 0.005*"погибать" + 0.005*"город" '
  '+ 0.004*"находиться" + 0.004*"пожар" + 0.004*"взрыв" + 0.004*"около" + '
  '0.004*"область" + 0.004*"район"'),
 (4,
  '0.011*"фильм" + 0.006*"the" + 0.005*"игра" + 0.005*"проект" + '
  '0.005*"картина" + 0.005*"компания" + 0.004*"роль" + 0.004*"американский" + '
  '0.004*"режиссер" + 0.004*"сша"'),
 (5,
  '0.008*"дело" + 0.006*"рубль" + 0.005*"рф" + 0.004*"служба" + '
  '0.004*"уголовный" + 0.004*"глава" + 0.004*"управление" + 0.004*"сотрудник" '
  '+ 0.004*"федеральный" + 0.003*"украина"'),
 (6,
  '0.006*"миллион" + 0.006*"клуб" + 0.004*"группа" + 0.004*"the" + '
  '0.003*"премия" + 0.003*"хороший" + 0.003*"главный" + 0.003*"альбом" + '
  '0.003*"доллар" + 0.003*"матч"'),
 (7,
  '0.006*"полиция" + 0.005*"задерживать" + 0.004*"сотрудник" + 0.004*"дело" + '
  '0.004*"мужчина" + 0.004*"убийство" + 0.004*"происходить" + '
  '0.004*"находиться" + 0.004*"город" + 0.004*"ребенок"'),
 (8,
  '0.007*"сша" + 0.005*"власть" + 0.005*"правительство" + 0.004*"израиль" + '
  '0.004*"ирак" + 0.003*"турция" + 0.003*"против" + 0.003*"американский" + '
  '0.003*"организация" + 0.003*"принимать"'),
 (9,
  '0.011*"ученый" + 0.004*"автомобиль" + 0.003*"результат" + '
  '0.003*"исследование" + 0.003*"обнаруживать" + 0.003*"водитель" + '
  '0.003*"звезда" + 0.003*"происходить" + 0.003*"земля" + '
  '0.003*"исследователь"'),
 (10,
  '0.015*"президент" + 0.009*"украина" + 0.006*"глава" + 0.006*"путин" + '
  '0.005*"выборы" + 0.005*"сша" + 0.004*"владимир" + 0.004*"украинский" + '
  '0.004*"министр" + 0.004*"лидер"'),
 (11,
  '0.013*"суд" + 0.007*"дело" + 0.006*"решение" + 0.004*"бывший" + 0.004*"сша" '
  '+ 0.004*"президент" + 0.003*"обвинение" + 0.003*"глава" + 0.003*"депутат" + '
  '0.003*"партия"'),
 (12,
  '0.009*"украина" + 0.008*"газ" + 0.005*"компания" + 0.004*"газпром" + '
  '0.004*"процент" + 0.003*"закон" + 0.003*"цена" + 0.003*"украинский" + '
  '0.003*"поставка" + 0.003*"принимать"'),
 (13,
  '0.008*"компания" + 0.006*"пользователь" + 0.006*"сайт" + 0.006*"сеть" + '
  '0.004*"тысяча" + 0.004*"система" + 0.003*"работа" + 0.003*"программа" + '
  '0.003*"сервис" + 0.003*"появляться"'),
 (14,
  '0.012*"доллар" + 0.011*"миллиард" + 0.010*"процент" + 0.010*"компания" + '
  '0.009*"банк" + 0.008*"рубль" + 0.005*"акция" + 0.005*"миллиард доллар" + '
  '0.005*"нефть" + 0.005*"рынок"')]
In [ ]:
mdiff, annotation = best_lda_model1.diff(best_lda_model1, distance='jaccard', num_words=50)
plot_difference(mdiff, title="Topic difference (one model) [jaccard distance]", annotation=annotation)
In [ ]:
# Visualize the topics
pyLDAvis.enable_notebook()
vis1 = pyLDAvis.gensim.prepare(best_lda_model1, gensim_corpus, gensim_dict)
vis1
Out[ ]:
In [ ]:
%%time
best_lda_model2 = gensim.models.LdaMulticore(corpus=gensim_corpus,
                                           id2word=gensim_dict,
                                           num_topics=15, 
                                           random_state=100,                                           
                                           workers = 3,
                                           passes=1,
                                           eta = 0.2,
                                           alpha = 0.2
                                        )
CPU times: user 2min 32s, sys: 1.9 s, total: 2min 33s
Wall time: 2min 49s
In [ ]:
data_list[0]
Out[ ]:
'крупный сша нефтяной компания сша exxonmobil помощь компания катар построить техас терминал сжижение дальнейший экспорт природный газ общий стоимость десять миллиард доллар соответствующий соглашение exxonmobil подписывать qatar petroleum international передавать bloomberg реализация проект сторона образовывать дочерний предприятие golden pass products llc фирма прошлый год получать разрешение экспорт спг страна который сша иметься соглашение свободный торговля прием спг терминал golden pass работать 2010 год планироваться ежегодный объем поставка спг построить терминал составлять 156 миллион тонна проект должный получать окончательный одобрение американский власть апрель сообщаться exxonmobil также собираться построить самый большой мир плавучий завод выпуск спг сотрудничество англоавстралийский горнодобывающий bhp billiton затрата указанный проект оценка эксперт превышать 12 миллиард доллар мощность спгзавод достигать шестисемь миллион тонна год'
In [ ]:
best_lda_model2.get_document_topics(gensim_corpus[0])
Out[ ]:
[(1, 0.80055153), (8, 0.087567635), (12, 0.09015758)]
In [ ]:
# Compute Coherence Score
coherence_model_lda2 = CoherenceModel(model=best_lda_model2, texts=data_words, dictionary=gensim_dict, coherence='c_v')
coherence_lda2 = coherence_model_lda2.get_coherence()
print('Coherence Score: ', coherence_lda2)
Coherence Score:  0.6419986510567619
In [ ]:
pprint(best_lda_model2.print_topics())
[(0,
  '0.013*"матч" + 0.009*"команда" + 0.009*"сборная" + 0.008*"чемпионат" + '
  '0.006*"счет" + 0.006*"мир" + 0.005*"клуб" + 0.005*"игра" + 0.005*"место" + '
  '0.005*"победа"'),
 (1,
  '0.022*"процент" + 0.014*"компания" + 0.009*"миллион" + 0.008*"доллар" + '
  '0.008*"составлять" + 0.008*"тысяча" + 0.008*"миллиард" + 0.006*"рубль" + '
  '0.004*"рынок" + 0.004*"метр"'),
 (2,
  '0.010*"самолет" + 0.007*"военный" + 0.004*"сша" + 0.004*"ракета" + '
  '0.003*"аэропорт" + 0.003*"город" + 0.003*"авиакомпания" + '
  '0.003*"американский" + 0.003*"сирия" + 0.003*"корабль"'),
 (3,
  '0.007*"происходить" + 0.005*"результат" + 0.005*"погибать" + '
  '0.005*"находиться" + 0.004*"пожар" + 0.004*"взрыв" + 0.004*"город" + '
  '0.004*"около" + 0.004*"район" + 0.004*"пострадать"'),
 (4,
  '0.012*"фильм" + 0.006*"the" + 0.006*"игра" + 0.004*"картина" + 0.004*"роль" '
  '+ 0.004*"компания" + 0.004*"выходить" + 0.004*"американский" + '
  '0.004*"проект" + 0.004*"режиссер"'),
 (5,
  '0.006*"украина" + 0.005*"дело" + 0.005*"рубль" + 0.005*"глава" + 0.004*"рф" '
  '+ 0.004*"президент" + 0.004*"служба" + 0.003*"украинский" + '
  '0.003*"федеральный" + 0.003*"закон"'),
 (6,
  '0.007*"миллион" + 0.004*"the" + 0.004*"группа" + 0.003*"клуб" + '
  '0.003*"доллар" + 0.003*"премия" + 0.003*"альбом" + 0.003*"издание" + '
  '0.003*"тысяча" + 0.003*"театр"'),
 (7,
  '0.006*"полиция" + 0.005*"задерживать" + 0.005*"сотрудник" + 0.005*"дело" + '
  '0.004*"мужчина" + 0.004*"происходить" + 0.004*"находиться" + '
  '0.004*"убийство" + 0.003*"город" + 0.003*"полицейский"'),
 (8,
  '0.005*"власть" + 0.005*"сша" + 0.004*"правительство" + 0.004*"израиль" + '
  '0.003*"турция" + 0.003*"организация" + 0.003*"против" + 0.003*"государство" '
  '+ 0.003*"ирак" + 0.003*"территория"'),
 (9,
  '0.009*"ученый" + 0.004*"автомобиль" + 0.003*"результат" + 0.003*"животное" '
  '+ 0.003*"исследование" + 0.003*"обнаруживать" + 0.003*"работа" + '
  '0.003*"происходить" + 0.003*"земля" + 0.003*"водитель"'),
 (10,
  '0.014*"президент" + 0.006*"сша" + 0.006*"украина" + 0.005*"глава" + '
  '0.005*"выборы" + 0.005*"путин" + 0.004*"лидер" + 0.003*"вопрос" + '
  '0.003*"государство" + 0.003*"владимир"'),
 (11,
  '0.013*"суд" + 0.008*"дело" + 0.005*"решение" + 0.004*"бывший" + '
  '0.003*"обвинение" + 0.003*"сша" + 0.003*"глава" + 0.003*"адвокат" + '
  '0.003*"президент" + 0.003*"признавать"'),
 (12,
  '0.009*"украина" + 0.008*"газ" + 0.005*"процент" + 0.005*"компания" + '
  '0.005*"газпром" + 0.003*"цена" + 0.003*"украинский" + 0.003*"поставка" + '
  '0.003*"тысяча" + 0.003*"кубометр"'),
 (13,
  '0.008*"компания" + 0.006*"пользователь" + 0.006*"сеть" + 0.006*"сайт" + '
  '0.004*"тысяча" + 0.004*"система" + 0.003*"сервис" + 0.003*"работа" + '
  '0.003*"программа" + 0.003*"интернет"'),
 (14,
  '0.011*"доллар" + 0.011*"банк" + 0.009*"процент" + 0.009*"миллиард" + '
  '0.007*"рубль" + 0.006*"нефть" + 0.005*"рынок" + 0.004*"финансовый" + '
  '0.004*"компания" + 0.004*"миллиард доллар"')]
In [ ]:
mdiff, annotation = best_lda_model2.diff(best_lda_model2, distance='jaccard', num_words=50)
plot_difference(mdiff, title="Topic difference (one model) [jaccard distance]", annotation=annotation)
In [ ]:
# Visualize the topics
pyLDAvis.enable_notebook()
vis2 = pyLDAvis.gensim.prepare(best_lda_model2, gensim_corpus, gensim_dict)
vis2
Out[ ]:
In [ ]:
%%time
best_lda_model3 = gensim.models.LdaMulticore(corpus=gensim_corpus,
                                           id2word=gensim_dict,
                                           num_topics=15, 
                                           random_state=100,                                           
                                           workers = 3,
                                           passes=1,
                                           eta = 10,
                                           alpha = 10
                                        )
CPU times: user 1min 59s, sys: 1.74 s, total: 2min 1s
Wall time: 2min 2s
In [ ]:
data_list[0]
Out[ ]:
'крупный сша нефтяной компания сша exxonmobil помощь компания катар построить техас терминал сжижение дальнейший экспорт природный газ общий стоимость десять миллиард доллар соответствующий соглашение exxonmobil подписывать qatar petroleum international передавать bloomberg реализация проект сторона образовывать дочерний предприятие golden pass products llc фирма прошлый год получать разрешение экспорт спг страна который сша иметься соглашение свободный торговля прием спг терминал golden pass работать 2010 год планироваться ежегодный объем поставка спг построить терминал составлять 156 миллион тонна проект должный получать окончательный одобрение американский власть апрель сообщаться exxonmobil также собираться построить самый большой мир плавучий завод выпуск спг сотрудничество англоавстралийский горнодобывающий bhp billiton затрата указанный проект оценка эксперт превышать 12 миллиард доллар мощность спгзавод достигать шестисемь миллион тонна год'
In [ ]:
best_lda_model3.get_document_topics(gensim_corpus[0])
Out[ ]:
[(0, 0.06582554),
 (1, 0.0669054),
 (2, 0.066905305),
 (3, 0.066218495),
 (4, 0.06800137),
 (5, 0.066448286),
 (6, 0.06573148),
 (7, 0.06642258),
 (8, 0.067143604),
 (9, 0.065733336),
 (10, 0.06797478),
 (11, 0.0669008),
 (12, 0.066957824),
 (13, 0.06579623),
 (14, 0.067035)]
In [ ]:
# Compute Coherence Score
coherence_model_lda3 = CoherenceModel(model=best_lda_model3, texts=data_words, dictionary=gensim_dict, coherence='c_v')
coherence_lda3 = coherence_model_lda3.get_coherence()
print('Coherence Score: ', coherence_lda3)
Coherence Score:  0.6191380841919797
In [ ]:
pprint(best_lda_model3.print_topics())
[(0,
  '0.003*"процент" + 0.002*"компания" + 0.002*"тысяча" + 0.002*"президент" + '
  '0.002*"сша" + 0.002*"рубль" + 0.002*"место" + 0.002*"доллар" + '
  '0.002*"украина" + 0.002*"глава"'),
 (1,
  '0.003*"процент" + 0.003*"компания" + 0.002*"тысяча" + 0.002*"суд" + '
  '0.002*"сша" + 0.002*"доллар" + 0.002*"около" + 0.002*"президент" + '
  '0.002*"новость" + 0.002*"сайт"'),
 (2,
  '0.003*"компания" + 0.002*"процент" + 0.002*"президент" + 0.002*"дело" + '
  '0.002*"тысяча" + 0.002*"рубль" + 0.002*"москва" + 0.002*"город" + '
  '0.002*"власть" + 0.002*"работа"'),
 (3,
  '0.003*"процент" + 0.002*"компания" + 0.002*"миллион" + 0.002*"президент" + '
  '0.002*"составлять" + 0.002*"рубль" + 0.002*"представитель" + 0.002*"сша" + '
  '0.002*"дело" + 0.002*"глава"'),
 (4,
  '0.003*"президент" + 0.003*"компания" + 0.002*"сша" + 0.002*"доллар" + '
  '0.002*"тысяча" + 0.002*"процент" + 0.002*"дело" + 0.002*"миллион" + '
  '0.002*"москва" + 0.002*"работа"'),
 (5,
  '0.003*"процент" + 0.002*"компания" + 0.002*"президент" + 0.002*"дело" + '
  '0.002*"тысяча" + 0.002*"рубль" + 0.002*"глава" + 0.002*"сша" + '
  '0.002*"представитель" + 0.002*"москва"'),
 (6,
  '0.003*"компания" + 0.002*"президент" + 0.002*"миллион" + 0.002*"процент" + '
  '0.002*"тысяча" + 0.002*"принимать" + 0.002*"суд" + 0.002*"являться" + '
  '0.002*"доллар" + 0.002*"москва"'),
 (7,
  '0.003*"компания" + 0.003*"процент" + 0.002*"тысяча" + 0.002*"миллион" + '
  '0.002*"дело" + 0.002*"доллар" + 0.002*"президент" + 0.002*"находиться" + '
  '0.002*"сша" + 0.002*"город"'),
 (8,
  '0.002*"процент" + 0.002*"компания" + 0.002*"миллион" + 0.002*"доллар" + '
  '0.002*"президент" + 0.002*"тысяча" + 0.002*"сша" + 0.002*"являться" + '
  '0.002*"дело" + 0.002*"город"'),
 (9,
  '0.003*"процент" + 0.002*"президент" + 0.002*"миллион" + 0.002*"сша" + '
  '0.002*"компания" + 0.002*"тысяча" + 0.002*"дело" + 0.002*"день" + '
  '0.002*"рубль" + 0.002*"представитель"'),
 (10,
  '0.003*"компания" + 0.003*"процент" + 0.002*"президент" + 0.002*"дело" + '
  '0.002*"сша" + 0.002*"доллар" + 0.002*"миллион" + 0.002*"результат" + '
  '0.002*"тысяча" + 0.002*"представитель"'),
 (11,
  '0.003*"доллар" + 0.002*"сша" + 0.002*"тысяча" + 0.002*"компания" + '
  '0.002*"президент" + 0.002*"дело" + 0.002*"представитель" + 0.002*"решение" '
  '+ 0.002*"глава" + 0.002*"миллион"'),
 (12,
  '0.003*"процент" + 0.003*"компания" + 0.002*"тысяча" + 0.002*"день" + '
  '0.002*"миллион" + 0.002*"доллар" + 0.002*"сша" + 0.002*"президент" + '
  '0.002*"место" + 0.002*"представитель"'),
 (13,
  '0.003*"компания" + 0.002*"процент" + 0.002*"тысяча" + 0.002*"доллар" + '
  '0.002*"президент" + 0.002*"дело" + 0.002*"миллион" + 0.002*"москва" + '
  '0.002*"сша" + 0.002*"украина"'),
 (14,
  '0.003*"процент" + 0.002*"президент" + 0.002*"доллар" + 0.002*"компания" + '
  '0.002*"сша" + 0.002*"тысяча" + 0.002*"дело" + 0.002*"москва" + '
  '0.002*"представитель" + 0.002*"миллиард"')]
In [ ]:
mdiff, annotation = best_lda_model3.diff(best_lda_model3, distance='jaccard', num_words=50)
plot_difference(mdiff, title="Topic difference (one model) [jaccard distance]", annotation=annotation)

These parameters cause too little sparsity, this not good for the quality of topics, the difference is insignificant.

In [ ]:
# Visualize the topics
pyLDAvis.enable_notebook()
vis3 = pyLDAvis.gensim.prepare(best_lda_model3, gensim_corpus, gensim_dict)
vis3
Out[ ]:

Let's increase sparsity to create independent interpretive topics.

In [ ]:
%%time
best_lda_model4 = gensim.models.LdaMulticore(corpus=gensim_corpus,
                                           id2word=gensim_dict,
                                           num_topics=15, 
                                           random_state=100,                                           
                                           workers = 3,
                                           passes=1,
                                           eta = 0.01,
                                           alpha = 0.01
                                        )
CPU times: user 2min 29s, sys: 2.21 s, total: 2min 31s
Wall time: 2min 52s
In [ ]:
data_list[0]
Out[ ]:
'крупный сша нефтяной компания сша exxonmobil помощь компания катар построить техас терминал сжижение дальнейший экспорт природный газ общий стоимость десять миллиард доллар соответствующий соглашение exxonmobil подписывать qatar petroleum international передавать bloomberg реализация проект сторона образовывать дочерний предприятие golden pass products llc фирма прошлый год получать разрешение экспорт спг страна который сша иметься соглашение свободный торговля прием спг терминал golden pass работать 2010 год планироваться ежегодный объем поставка спг построить терминал составлять 156 миллион тонна проект должный получать окончательный одобрение американский власть апрель сообщаться exxonmobil также собираться построить самый большой мир плавучий завод выпуск спг сотрудничество англоавстралийский горнодобывающий bhp billiton затрата указанный проект оценка эксперт превышать 12 миллиард доллар мощность спгзавод достигать шестисемь миллион тонна год'
In [ ]:
best_lda_model4.get_document_topics(gensim_corpus[0])
Out[ ]:
[(1, 0.1776785), (14, 0.8211413)]
In [ ]:
# Compute Coherence Score
coherence_model_lda4 = CoherenceModel(model=best_lda_model4, texts=data_words, dictionary=gensim_dict, coherence='c_v')
coherence_lda4 = coherence_model_lda4.get_coherence()
print('Coherence Score: ', coherence_lda4)
Coherence Score:  0.6313864480212327
In [ ]:
pprint(best_lda_model4.print_topics())
[(0,
  '0.013*"матч" + 0.009*"команда" + 0.009*"сборная" + 0.008*"чемпионат" + '
  '0.006*"счет" + 0.006*"игра" + 0.006*"мир" + 0.005*"место" + 0.005*"победа" '
  '+ 0.004*"второй"'),
 (1,
  '0.027*"процент" + 0.011*"компания" + 0.009*"тысяча" + 0.009*"миллион" + '
  '0.008*"составлять" + 0.007*"доллар" + 0.006*"рубль" + 0.005*"миллиард" + '
  '0.004*"рынок" + 0.004*"метр"'),
 (2,
  '0.010*"самолет" + 0.006*"военный" + 0.004*"сша" + 0.004*"ракета" + '
  '0.004*"аэропорт" + 0.004*"сирия" + 0.004*"город" + 0.003*"авиакомпания" + '
  '0.003*"американский" + 0.003*"находиться"'),
 (3,
  '0.006*"происходить" + 0.005*"результат" + 0.004*"находиться" + '
  '0.004*"погибать" + 0.004*"пожар" + 0.004*"город" + 0.004*"область" + '
  '0.004*"около" + 0.004*"взрыв" + 0.004*"район"'),
 (4,
  '0.011*"фильм" + 0.006*"the" + 0.005*"игра" + 0.005*"проект" + '
  '0.004*"компания" + 0.004*"картина" + 0.004*"роль" + 0.004*"американский" + '
  '0.004*"сша" + 0.004*"режиссер"'),
 (5,
  '0.007*"дело" + 0.005*"рубль" + 0.005*"рф" + 0.004*"украина" + 0.004*"глава" '
  '+ 0.004*"служба" + 0.003*"уголовный" + 0.003*"федеральный" + '
  '0.003*"управление" + 0.003*"сотрудник"'),
 (6,
  '0.007*"миллион" + 0.005*"клуб" + 0.004*"группа" + 0.003*"доллар" + '
  '0.003*"the" + 0.003*"премия" + 0.003*"главный" + 0.003*"альбом" + '
  '0.003*"миллион доллар" + 0.003*"издание"'),
 (7,
  '0.006*"полиция" + 0.005*"задерживать" + 0.004*"сотрудник" + 0.004*"дело" + '
  '0.004*"мужчина" + 0.004*"происходить" + 0.004*"находиться" + '
  '0.004*"убийство" + 0.004*"город" + 0.003*"ребенок"'),
 (8,
  '0.006*"сша" + 0.005*"власть" + 0.004*"правительство" + 0.003*"турция" + '
  '0.003*"израиль" + 0.003*"американский" + 0.003*"ирак" + 0.003*"против" + '
  '0.003*"принимать" + 0.003*"организация"'),
 (9,
  '0.010*"ученый" + 0.004*"автомобиль" + 0.003*"результат" + '
  '0.003*"исследование" + 0.003*"обнаруживать" + 0.003*"водитель" + '
  '0.003*"работа" + 0.003*"происходить" + 0.003*"исследователь" + '
  '0.003*"земля"'),
 (10,
  '0.014*"президент" + 0.008*"украина" + 0.006*"глава" + 0.005*"путин" + '
  '0.005*"выборы" + 0.005*"сша" + 0.004*"владимир" + 0.004*"лидер" + '
  '0.004*"министр" + 0.004*"государство"'),
 (11,
  '0.012*"суд" + 0.007*"дело" + 0.005*"решение" + 0.004*"бывший" + 0.004*"сша" '
  '+ 0.004*"президент" + 0.003*"обвинение" + 0.003*"глава" + 0.003*"партия" + '
  '0.003*"депутат"'),
 (12,
  '0.011*"украина" + 0.009*"газ" + 0.005*"компания" + 0.004*"газпром" + '
  '0.004*"украинский" + 0.004*"процент" + 0.003*"поставка" + 0.003*"цена" + '
  '0.003*"тысяча" + 0.003*"принимать"'),
 (13,
  '0.008*"компания" + 0.006*"пользователь" + 0.006*"сеть" + 0.005*"сайт" + '
  '0.005*"тысяча" + 0.004*"система" + 0.003*"работа" + 0.003*"сервис" + '
  '0.003*"миллион" + 0.003*"программа"'),
 (14,
  '0.011*"доллар" + 0.011*"миллиард" + 0.009*"процент" + 0.009*"компания" + '
  '0.009*"банк" + 0.008*"рубль" + 0.005*"акция" + 0.005*"миллиард доллар" + '
  '0.005*"нефть" + 0.004*"рынок"')]
In [ ]:
mdiff, annotation = best_lda_model4.diff(best_lda_model4, distance='jaccard', num_words=50)
plot_difference(mdiff, title="Topic difference (one model) [jaccard distance]", annotation=annotation)
In [ ]:
# Visualize the topics
pyLDAvis.enable_notebook()
vis4 = pyLDAvis.gensim.prepare(best_lda_model4, gensim_corpus, gensim_dict)
vis4
Out[ ]:
In [ ]:
%%time
best_lda_model5 = gensim.models.LdaMulticore(corpus=gensim_corpus,
                                           id2word=gensim_dict,
                                           num_topics=15, 
                                           random_state=100,                                           
                                           workers = 3,
                                           passes=1,
                                           eta = 0.005,
                                           alpha = 0.01
                                        )
CPU times: user 2min 30s, sys: 2.13 s, total: 2min 33s
Wall time: 2min 50s
In [ ]:
data_list[0]
Out[ ]:
'крупный сша нефтяной компания сша exxonmobil помощь компания катар построить техас терминал сжижение дальнейший экспорт природный газ общий стоимость десять миллиард доллар соответствующий соглашение exxonmobil подписывать qatar petroleum international передавать bloomberg реализация проект сторона образовывать дочерний предприятие golden pass products llc фирма прошлый год получать разрешение экспорт спг страна который сша иметься соглашение свободный торговля прием спг терминал golden pass работать 2010 год планироваться ежегодный объем поставка спг построить терминал составлять 156 миллион тонна проект должный получать окончательный одобрение американский власть апрель сообщаться exxonmobil также собираться построить самый большой мир плавучий завод выпуск спг сотрудничество англоавстралийский горнодобывающий bhp billiton затрата указанный проект оценка эксперт превышать 12 миллиард доллар мощность спгзавод достигать шестисемь миллион тонна год'
In [ ]:
best_lda_model5.get_document_topics(gensim_corpus[0])
Out[ ]:
[(1, 0.12701243), (12, 0.039534383), (14, 0.8323637)]
In [ ]:
# Compute Coherence Score
coherence_model_lda5 = CoherenceModel(model=best_lda_model5, texts=data_words, dictionary=gensim_dict, coherence='c_v')
coherence_lda5 = coherence_model_lda5.get_coherence()
print('Coherence Score: ', coherence_lda5)
Coherence Score:  0.6353702005178696
In [ ]:
pprint(best_lda_model5.print_topics())
[(0,
  '0.013*"матч" + 0.009*"команда" + 0.009*"сборная" + 0.008*"чемпионат" + '
  '0.007*"счет" + 0.006*"игра" + 0.006*"мир" + 0.005*"победа" + 0.005*"место" '
  '+ 0.004*"второй"'),
 (1,
  '0.029*"процент" + 0.010*"тысяча" + 0.009*"компания" + 0.009*"составлять" + '
  '0.009*"миллион" + 0.007*"доллар" + 0.006*"рубль" + 0.005*"миллиард" + '
  '0.005*"метр" + 0.004*"рынок"'),
 (2,
  '0.011*"самолет" + 0.006*"военный" + 0.004*"сша" + 0.004*"ракета" + '
  '0.004*"аэропорт" + 0.004*"сирия" + 0.004*"город" + 0.003*"авиакомпания" + '
  '0.003*"американский" + 0.003*"находиться"'),
 (3,
  '0.006*"происходить" + 0.005*"результат" + 0.004*"погибать" + '
  '0.004*"находиться" + 0.004*"город" + 0.004*"пожар" + 0.004*"взрыв" + '
  '0.004*"около" + 0.004*"область" + 0.004*"район"'),
 (4,
  '0.011*"фильм" + 0.006*"the" + 0.005*"игра" + 0.005*"проект" + '
  '0.005*"компания" + 0.004*"картина" + 0.004*"роль" + 0.004*"американский" + '
  '0.004*"сша" + 0.004*"режиссер"'),
 (5,
  '0.008*"дело" + 0.006*"рубль" + 0.005*"рф" + 0.004*"служба" + '
  '0.004*"уголовный" + 0.004*"глава" + 0.004*"украина" + 0.004*"управление" + '
  '0.004*"сотрудник" + 0.003*"федеральный"'),
 (6,
  '0.006*"миллион" + 0.005*"клуб" + 0.004*"the" + 0.004*"группа" + '
  '0.003*"премия" + 0.003*"доллар" + 0.003*"хороший" + 0.003*"главный" + '
  '0.003*"альбом" + 0.003*"песня"'),
 (7,
  '0.006*"полиция" + 0.005*"задерживать" + 0.004*"сотрудник" + 0.004*"дело" + '
  '0.004*"мужчина" + 0.004*"происходить" + 0.004*"убийство" + '
  '0.004*"находиться" + 0.004*"город" + 0.003*"ребенок"'),
 (8,
  '0.007*"сша" + 0.005*"власть" + 0.004*"правительство" + 0.004*"израиль" + '
  '0.004*"ирак" + 0.003*"турция" + 0.003*"американский" + 0.003*"против" + '
  '0.003*"военный" + 0.003*"организация"'),
 (9,
  '0.010*"ученый" + 0.004*"автомобиль" + 0.003*"результат" + '
  '0.003*"исследование" + 0.003*"обнаруживать" + 0.003*"водитель" + '
  '0.003*"звезда" + 0.003*"происходить" + 0.003*"работа" + '
  '0.003*"исследователь"'),
 (10,
  '0.015*"президент" + 0.009*"украина" + 0.006*"глава" + 0.005*"путин" + '
  '0.005*"выборы" + 0.005*"сша" + 0.004*"министр" + 0.004*"владимир" + '
  '0.004*"украинский" + 0.004*"государство"'),
 (11,
  '0.012*"суд" + 0.007*"дело" + 0.005*"решение" + 0.004*"бывший" + '
  '0.004*"президент" + 0.004*"сша" + 0.003*"глава" + 0.003*"депутат" + '
  '0.003*"обвинение" + 0.003*"партия"'),
 (12,
  '0.009*"украина" + 0.008*"газ" + 0.005*"компания" + 0.004*"газпром" + '
  '0.004*"процент" + 0.003*"цена" + 0.003*"украинский" + 0.003*"закон" + '
  '0.003*"поставка" + 0.003*"тысяча"'),
 (13,
  '0.008*"компания" + 0.006*"пользователь" + 0.006*"сеть" + 0.005*"сайт" + '
  '0.005*"тысяча" + 0.004*"система" + 0.003*"работа" + 0.003*"сервис" + '
  '0.003*"программа" + 0.003*"миллион"'),
 (14,
  '0.011*"доллар" + 0.011*"миллиард" + 0.010*"компания" + 0.010*"процент" + '
  '0.008*"банк" + 0.008*"рубль" + 0.005*"акция" + 0.005*"миллиард доллар" + '
  '0.005*"нефть" + 0.005*"рынок"')]
In [ ]:
mdiff, annotation = best_lda_model5.diff(best_lda_model5, distance='jaccard', num_words=50)
plot_difference(mdiff, title="Topic difference (one model) [jaccard distance]", annotation=annotation)
In [ ]:
# Visualize the topics
pyLDAvis.enable_notebook()
vis5 = pyLDAvis.gensim.prepare(best_lda_model5, gensim_corpus, gensim_dict)
vis5
Out[ ]:

So, we have some good sets of parameters, let's see the difference between the topics for 5 and 4 models. It is important to compare them.

In [ ]:
mdiff, annotation = best_lda_model4.diff(best_lda_model5, distance='jaccard', num_words=50)
plot_difference(mdiff, title="Topic difference (two model) [jaccard distance]", annotation=annotation)

So, let's see the difference in practice.

In [ ]:
pprint(best_lda_model4.print_topics())
[(0,
  '0.013*"матч" + 0.009*"команда" + 0.009*"сборная" + 0.008*"чемпионат" + '
  '0.006*"счет" + 0.006*"игра" + 0.006*"мир" + 0.005*"место" + 0.005*"победа" '
  '+ 0.004*"второй"'),
 (1,
  '0.027*"процент" + 0.011*"компания" + 0.009*"тысяча" + 0.009*"миллион" + '
  '0.008*"составлять" + 0.007*"доллар" + 0.006*"рубль" + 0.005*"миллиард" + '
  '0.004*"рынок" + 0.004*"метр"'),
 (2,
  '0.010*"самолет" + 0.006*"военный" + 0.004*"сша" + 0.004*"ракета" + '
  '0.004*"аэропорт" + 0.004*"сирия" + 0.004*"город" + 0.003*"авиакомпания" + '
  '0.003*"американский" + 0.003*"находиться"'),
 (3,
  '0.006*"происходить" + 0.005*"результат" + 0.004*"находиться" + '
  '0.004*"погибать" + 0.004*"пожар" + 0.004*"город" + 0.004*"область" + '
  '0.004*"около" + 0.004*"взрыв" + 0.004*"район"'),
 (4,
  '0.011*"фильм" + 0.006*"the" + 0.005*"игра" + 0.005*"проект" + '
  '0.004*"компания" + 0.004*"картина" + 0.004*"роль" + 0.004*"американский" + '
  '0.004*"сша" + 0.004*"режиссер"'),
 (5,
  '0.007*"дело" + 0.005*"рубль" + 0.005*"рф" + 0.004*"украина" + 0.004*"глава" '
  '+ 0.004*"служба" + 0.003*"уголовный" + 0.003*"федеральный" + '
  '0.003*"управление" + 0.003*"сотрудник"'),
 (6,
  '0.007*"миллион" + 0.005*"клуб" + 0.004*"группа" + 0.003*"доллар" + '
  '0.003*"the" + 0.003*"премия" + 0.003*"главный" + 0.003*"альбом" + '
  '0.003*"миллион доллар" + 0.003*"издание"'),
 (7,
  '0.006*"полиция" + 0.005*"задерживать" + 0.004*"сотрудник" + 0.004*"дело" + '
  '0.004*"мужчина" + 0.004*"происходить" + 0.004*"находиться" + '
  '0.004*"убийство" + 0.004*"город" + 0.003*"ребенок"'),
 (8,
  '0.006*"сша" + 0.005*"власть" + 0.004*"правительство" + 0.003*"турция" + '
  '0.003*"израиль" + 0.003*"американский" + 0.003*"ирак" + 0.003*"против" + '
  '0.003*"принимать" + 0.003*"организация"'),
 (9,
  '0.010*"ученый" + 0.004*"автомобиль" + 0.003*"результат" + '
  '0.003*"исследование" + 0.003*"обнаруживать" + 0.003*"водитель" + '
  '0.003*"работа" + 0.003*"происходить" + 0.003*"исследователь" + '
  '0.003*"земля"'),
 (10,
  '0.014*"президент" + 0.008*"украина" + 0.006*"глава" + 0.005*"путин" + '
  '0.005*"выборы" + 0.005*"сша" + 0.004*"владимир" + 0.004*"лидер" + '
  '0.004*"министр" + 0.004*"государство"'),
 (11,
  '0.012*"суд" + 0.007*"дело" + 0.005*"решение" + 0.004*"бывший" + 0.004*"сша" '
  '+ 0.004*"президент" + 0.003*"обвинение" + 0.003*"глава" + 0.003*"партия" + '
  '0.003*"депутат"'),
 (12,
  '0.011*"украина" + 0.009*"газ" + 0.005*"компания" + 0.004*"газпром" + '
  '0.004*"украинский" + 0.004*"процент" + 0.003*"поставка" + 0.003*"цена" + '
  '0.003*"тысяча" + 0.003*"принимать"'),
 (13,
  '0.008*"компания" + 0.006*"пользователь" + 0.006*"сеть" + 0.005*"сайт" + '
  '0.005*"тысяча" + 0.004*"система" + 0.003*"работа" + 0.003*"сервис" + '
  '0.003*"миллион" + 0.003*"программа"'),
 (14,
  '0.011*"доллар" + 0.011*"миллиард" + 0.009*"процент" + 0.009*"компания" + '
  '0.009*"банк" + 0.008*"рубль" + 0.005*"акция" + 0.005*"миллиард доллар" + '
  '0.005*"нефть" + 0.004*"рынок"')]
In [ ]:
data_list[800]
Out[ ]:
'али магомедов указ президент рф дмитрий медведев назначать пост министр внутренний дело дагестан это сообщаться сайт кремль новый назначение офицер фсб магомедов занимать пост секретарь совет безопасность республика предполагаться имя новый министр становиться известно суббота 18 июль однако пятница назначение ссылка анонимный источник сообщать газета коммерсант данные издание пост глава мвд дагестан претендовать московский местный чиновник кандидатура магомедов утверждать неоднократный встреча министр внутренний дело рф рашида нургалиев президент республика муха алиев магомедов пост занимать убивать 5 июнь махачкала адильгерей магомедтагир министр ряд сотрудник дагестанский мвд убивать время свадьба дочь подчиненный магомедтагиров преступник использовать оружие стоять вооружение российский спецслужба автомат вал снайперский винтовка винторез убийство магомедтагиров связывать профессиональный деятельность версия министр собираться принимать участие выборы президент дагестан 2010 год'
In [ ]:
best_lda_model1.get_document_topics(gensim_corpus[800])
Out[ ]:
[(5, 0.26082084), (7, 0.24808884), (10, 0.48516443)]
In [ ]:
best_lda_model4.get_document_topics(gensim_corpus[800])
Out[ ]:
[(5, 0.2818823), (7, 0.25663793), (10, 0.4605853)]
In [ ]:
best_lda_model5.get_document_topics(gensim_corpus[800])
Out[ ]:
[(5, 0.24407268), (7, 0.2566756), (10, 0.4983572)]
In [ ]:
data_list[80000]
Out[ ]:
'петербург неизвестный мужчина сообщать телефон угроза взрыв отделение милиция сообщать риа новость прессцентр главный управление дело го чс звонить утверждать бомба закладывать помещение 74го 75го городской отделение красносельский невский район город рувд невский район 74м отделение милиция красносельский рувд журналист подтвердить информация милиционер проверять помещение эвакуация сотрудник отделение проводиться поздно прибыль кинолог собака взрывотехника омон называть телефонный террорист отделение милиция бомба оказываться'
In [ ]:
best_lda_model1.get_document_topics(gensim_corpus[80000])
Out[ ]:
[(3, 0.23152639), (7, 0.7549319)]
In [ ]:
best_lda_model4.get_document_topics(gensim_corpus[80000])
Out[ ]:
[(3, 0.1624478), (7, 0.8354936)]
In [ ]:
best_lda_model5.get_document_topics(gensim_corpus[80000])
Out[ ]:
[(3, 0.22799832), (7, 0.7699431)]
In [ ]:
data_list[10000]
Out[ ]:
'военный управление следственный комитет россия приобретать китайский комплекс извлечение данный смартфон компьютер это сообщать русский служба бибиси ведомство закупать чемодан комплекс idc8811 forensic magicube общий стоимость пять миллион рубль устройство уметь обнаруживать декодировать история сообщение популярный мессенджер включая telegram viber skype также добывать данные пользователь facebook twitter девайс китайский компания magicube способный взламывать смартфон управление операционный система ios android позволять хакер получать доступ адрес электронный почта номер телефон владелец отмечаться взлом iphone уходить порядок девять минута рано следственный комитет ориентироваться израильский американский решение политический ситуация изменяться определять политика большой следственный комитет плотно работать военноследственный управление акцент делать техника который наиболее защищать возможный уязвимость мочь эксплуатироваться мало 10 год объяснять выбор ведомство дмитрий сатурченко генеральный директор компания эстер солюшнс связывать поставщик китайский оборудование экспертэкспресс март сообщаться региональный управление фсб следственный комитет мвд приобретать инструмент израильский компания cellebrite взлом любой iphone'
In [ ]:
best_lda_model1.get_document_topics(gensim_corpus[10000])
Out[ ]:
[(5, 0.3795884), (13, 0.6143083)]
In [ ]:
best_lda_model4.get_document_topics(gensim_corpus[10000])
Out[ ]:
[(5, 0.3789345), (13, 0.6201444)]
In [ ]:
best_lda_model5.get_document_topics(gensim_corpus[10000])
Out[ ]:
[(5, 0.3796603), (13, 0.6194186)]
In [ ]:
data_list[100000]
Out[ ]:
'оптовый цена сжиженный газ бытовой нужда повышаться начинать следующий год 15 процент сообщаться прессрелиз федеральный служба тариф тонна газ учет ндс стоить 6613 тысяча рубль 2009 год тариф повышаться значительно 28 процент 2008 год рост составлять 30 процент сжиженный газ являться основной вид топливо территория удалять система магистральный газопровод россия сельский местность уровень газификация превышать 45 процент ранее сообщаться согласно утверждать правительство антикризисный тарифный план стоимость газ весь потребитель 2010 год вырастать 266 процент рост цена население составлять 274 процент промышленность 265 процент 2011 год цена увеличивать среднее 157 процент 2012м 151 процент'
In [ ]:
best_lda_model1.get_document_topics(gensim_corpus[100000])
Out[ ]:
[(1, 0.7121579), (12, 0.279666)]
In [ ]:
best_lda_model4.get_document_topics(gensim_corpus[100000])
Out[ ]:
[(1, 0.75435936), (12, 0.24440433)]
In [ ]:
best_lda_model5.get_document_topics(gensim_corpus[100000])
Out[ ]:
[(1, 0.7393661), (12, 0.25939754)]

From my point of view, the 4-th model is the best. Let's increase the number of passes.

In [ ]:
%%time
best_lda_model_final = gensim.models.LdaMulticore(corpus=gensim_corpus,
                                           id2word=gensim_dict,
                                           num_topics=15, 
                                           random_state=100,                                           
                                           workers = 3,
                                           passes=3,
                                           eta = 0.01,
                                           alpha = 0.01
                                        )
CPU times: user 7min 38s, sys: 5.34 s, total: 7min 43s
Wall time: 8min 12s
In [ ]:
pprint(best_lda_model_final.print_topics())
[(0,
  '0.015*"матч" + 0.011*"команда" + 0.010*"сборная" + 0.009*"чемпионат" + '
  '0.009*"клуб" + 0.007*"счет" + 0.006*"мир" + 0.006*"игра" + 0.005*"место" + '
  '0.005*"победа"'),
 (1,
  '0.026*"процент" + 0.017*"миллион" + 0.014*"тысяча" + 0.013*"компания" + '
  '0.011*"составлять" + 0.011*"доллар" + 0.011*"рубль" + 0.006*"миллиард" + '
  '0.005*"миллион доллар" + 0.005*"стоимость"'),
 (2,
  '0.016*"самолет" + 0.012*"военный" + 0.006*"ракета" + 0.005*"сша" + '
  '0.005*"корабль" + 0.005*"аэропорт" + 0.005*"оборона" + 0.005*"полет" + '
  '0.004*"авиакомпания" + 0.004*"сила"'),
 (3,
  '0.008*"происходить" + 0.007*"результат" + 0.007*"погибать" + 0.007*"город" '
  '+ 0.007*"находиться" + 0.006*"взрыв" + 0.005*"район" + 0.005*"около" + '
  '0.005*"место" + 0.005*"пострадать"'),
 (4,
  '0.015*"фильм" + 0.008*"игра" + 0.007*"the" + 0.005*"роль" + 0.005*"картина" '
  '+ 0.005*"выходить" + 0.005*"актер" + 0.005*"американский" + '
  '0.005*"режиссер" + 0.004*"главный"'),
 (5,
  '0.007*"украина" + 0.006*"дело" + 0.006*"глава" + 0.005*"рф" + '
  '0.005*"служба" + 0.005*"область" + 0.004*"управление" + 0.004*"федеральный" '
  '+ 0.004*"ведомство" + 0.004*"украинский"'),
 (6,
  '0.005*"группа" + 0.005*"the" + 0.004*"премия" + 0.004*"миллион" + '
  '0.004*"музей" + 0.004*"работа" + 0.004*"конкурс" + 0.003*"песня" + '
  '0.003*"альбом" + 0.003*"издание"'),
 (7,
  '0.009*"полиция" + 0.007*"задерживать" + 0.006*"сотрудник" + 0.005*"мужчина" '
  '+ 0.005*"происходить" + 0.005*"дело" + 0.005*"убийство" + '
  '0.004*"полицейский" + 0.004*"орган" + 0.004*"находиться"'),
 (8,
  '0.011*"сша" + 0.007*"власть" + 0.005*"американский" + 0.005*"ирак" + '
  '0.004*"представитель" + 0.004*"организация" + 0.004*"израиль" + '
  '0.004*"правительство" + 0.004*"против" + 0.004*"военный"'),
 (9,
  '0.010*"ученый" + 0.005*"исследование" + 0.005*"животное" + '
  '0.005*"обнаруживать" + 0.004*"работа" + 0.004*"результат" + '
  '0.003*"университет" + 0.003*"исследователь" + 0.003*"опубликовывать" + '
  '0.003*"земля"'),
 (10,
  '0.019*"президент" + 0.009*"украина" + 0.007*"глава" + 0.007*"выборы" + '
  '0.006*"путин" + 0.006*"партия" + 0.005*"сша" + 0.005*"лидер" + '
  '0.004*"владимир" + 0.004*"вопрос"'),
 (11,
  '0.021*"суд" + 0.012*"дело" + 0.006*"решение" + 0.006*"бывший" + '
  '0.005*"обвинение" + 0.005*"признавать" + 0.005*"адвокат" + 0.004*"иск" + '
  '0.003*"депутат" + 0.003*"подавать"'),
 (12,
  '0.007*"газ" + 0.006*"украина" + 0.006*"проект" + 0.005*"закон" + '
  '0.005*"правительство" + 0.005*"должный" + 0.005*"законопроект" + '
  '0.004*"принимать" + 0.004*"газпром" + 0.004*"предлагать"'),
 (13,
  '0.013*"компания" + 0.009*"пользователь" + 0.008*"сайт" + 0.008*"сеть" + '
  '0.006*"система" + 0.004*"интернет" + 0.004*"сервис" + 0.004*"устройство" + '
  '0.004*"информация" + 0.003*"программа"'),
 (14,
  '0.014*"доллар" + 0.013*"миллиард" + 0.013*"процент" + 0.011*"банк" + '
  '0.011*"компания" + 0.009*"рубль" + 0.007*"акция" + 0.006*"миллиард доллар" '
  '+ 0.006*"нефть" + 0.005*"финансовый"')]
In [ ]:
best_lda_model_final.get_document_topics(gensim_corpus[800])
Out[ ]:
[(2, 0.022061346), (5, 0.48811212), (7, 0.25887495), (10, 0.23013158)]
In [ ]:
best_lda_model_final.get_document_topics(gensim_corpus[80000])
Out[ ]:
[(3, 0.26224774), (7, 0.7356937)]
In [ ]:
best_lda_model_final.get_document_topics(gensim_corpus[10000])
Out[ ]:
[(1, 0.040713176),
 (2, 0.04545448),
 (5, 0.3245186),
 (8, 0.019793311),
 (13, 0.568812)]
In [ ]:
best_lda_model_final.get_document_topics(gensim_corpus[100000])
Out[ ]:
[(1, 0.6904424), (12, 0.30832133)]
In [ ]:
# Compute Coherence Score
coherence_model_lda_final = CoherenceModel(model=best_lda_model_final, texts=data_words, dictionary=gensim_dict, coherence='c_v')
coherence_lda_final = coherence_model_lda_final.get_coherence()
print('Coherence Score: ', coherence_lda_final)
Coherence Score:  0.6646124436190975
In [ ]:
# Visualize the topics
pyLDAvis.enable_notebook()
vis_final = pyLDAvis.gensim.prepare(best_lda_model_final, gensim_corpus, gensim_dict)
vis_final
Out[ ]:

Ok, we have our model and the best parameters for a small stratified dataset. Let's solve our task and find the topics in the whole data.